ActiveQuery each all разное количество

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

ActiveQuery each all разное количество

Сообщение kukuruku »

Код: Выделить всё

$total1 = 0;
foreach($query->each() as $item) {
  $total1++;
}

$total2 = 0;
foreach($query->all() as $item) {
  $total2++;
}
при некоторых sql запросах $total1 не равно $total2
ошибка в $query->each(), появляется один дублирующийся объект
в чем может быть проблема?
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: ActiveQuery each all разное количество

Сообщение Alexum »

В вашем запросе примеряется сортировка? У всех записей в результатах есть уникальные поля (id)? Возможно проблема возникает на стороне БД при осуществлении запросов со смещением при отсутствии уникальных полей (одна и та же запись пролезает в разные блоки). Например, у MSSQL есть такая проблема и всегда приходится к параметру сортировки добавлять уникальное поле (для нормальной работы пагинатора в GridView). Сам each никогда не приходилось использовать, так что всё вышеописанное на уровне догадок.
Последний раз редактировалось Alexum 2018.11.22, 10:20, всего редактировалось 1 раз.
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: ActiveQuery each all разное количество

Сообщение kukuruku »

база mysql
сам запрос довольно большой и сложный (не тривиальный select)
тогда почему all() отдает правильное количество?
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: ActiveQuery each all разное количество

Сообщение Alexum »

kukuruku писал(а): 2018.11.22, 10:20 база mysql
сам запрос довольно большой и сложный (не тривиальный select)
тогда почему all() отдает правильное количество?
each() использует загрузку блоками (по-умолчанию кусками по 100), all() - это запрос на вытаскивание всего сразу.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: ActiveQuery each all разное количество

Сообщение andku83 »

Скорее всего используется JOIN который может увеличивать количество результирующих строк.
Возможно если вы сделаете ->asArray()->all() (и не будет ->indexBy('')) то увидите свою лишнюю запись.
Ответить