1 Отредактировано serg-smirnoff (2010-06-24 00:20:24)

Тема: Criteria::IN выбирает только уникальные значения, а надо что бы все

Вот такой код

$this->menu = MenuPeer::doSelect(new Criteria());
 if (isset($_COOKIE["sfCart"])){
 $arr = explode(":", $_COOKIE["sfCart"]);
}

print_r ($arr);
$cr = new Criteria();
$cr->add(PhotosPeer::ID, $arr, Criteria::IN);
$this->items = PhotosPeer::doSelect($cr);
print_r ($this->items);

Выводы массивов.

[b]arr[/b]

(
    [0] => 1
    [1] => 1
)

[b]this->items

[/b]Array
(
    [0] => Photos Object
        (
            [id:protected] => 1
            [part_id:protected] => 1
            [author_id:protected] => 
            [meta_id:protected] => 
            [photo_s:protected] => b035fb72a38c7f4d7c7ca5b7b269d448.jpg
            [photo_b:protected] => 0b4b773bdd4d77e3b54e21698f9b1957.jpg
            [size:protected] => 
            [price:protected] => 1500
            [ord:protected] => 1
            [is_active:protected] => 1
            [created_at:protected] => 2010-06-17 19:17:00
            [aParts:protected] => 
            [aAuthors:protected] => 
            [aMeta:protected] => 
            [alreadyInSave:protected] => 
            [alreadyInValidation:protected] => 
            [validationFailures:protected] => Array
                (
                )

            [_new:private] => 
            [_deleted:private] => 
            [modifiedColumns:protected] => Array
                (
                )

        )

)

Не пойму почему выбирает из БД только уникальные элементы. Мне надо что бы было выбрано два раза одна и та же запись. Что делаю не так?

2

Re: Criteria::IN выбирает только уникальные значения, а надо что бы все

А что у тебя показывает LOG файл в части того, как строит пропел запрос к БД?

3 Отредактировано relo_san (2010-06-24 09:33:35)

Re: Criteria::IN выбирает только уникальные значения, а надо что бы все

Бредите...
Кто вам вообще сказал, что если у вас в условии IN будет два одинаковых значения, они два раза выберутся? С какого перепугу?

Пропел тут ни при чем. Это стандартное поведение SQL. Записи в WHERE IN отбираются, исходя из условия соответствия одному из значений (фактически это WHERE OR). Первая запись соответствует одному из значений - она выбрана. А то, что там пришло два таких - так это БД никак не волнует.

В общем случае я честно говоря затрудняюсь сказать, каким образом вы можете выбрать, без использования извращений с джойнами, две одинаковые записи, и можете ли вообще. Попробуйте покурить форумы по SQL, я еще не проснулся.

Спустя какое-то время...
Мне искренне непонятно, зачем выбирать два раза одну и ту же запись и создавать два одинаковых объекта, если можно выбрать и создать один, далее пользоваться им столько раз, сколько нужно, особенно если в реальности повторов не два, а больше.
Не вдаваясь в нелогичность самой задачи, чтобы выбрать одну и ту же запись несколько раз в одной и той же выборке - у вас вариантов совсем немного. Либо писать процедуру, которая будет осуществлять данную выборку, либо извращаться с джойнами таблицы на саму себя. Но если вы заранее не знаете, сколько повторов вам может понадобиться - второй вариант вам не особо подойдет. Процедура надежнее.

Re: Criteria::IN выбирает только уникальные значения, а надо что бы все

Покурил, действительно вы правы. Тут и Criteria() все верно отработал и как бы это и есть стандартное поведение SQL запроса WHERE IN (выбирает 1 раз).

Необходимость возникла при написании Корзины на одном из сайтов. Сейчас обошел ее выборкой через цикл. Т.е. ушел от WHERE IN оставив только WHERE