Key в Active Data Provider

Уже исправленные репорты или принятые предложения
Ответить
Loveorigami
Сообщения: 953
Зарегистрирован: 2014.08.27, 21:54

Key в Active Data Provider

Сообщение Loveorigami » 2017.03.01, 13:42

Похоже на баг
Есть запрос, который вытягивает через rightJoin акции по объекту (один объект - много акций).

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

SELECT
  `obj`.*,
  `aq`.*
FROM `mx_object__item` `obj`
  RIGHT JOIN (
  // подзапрос с акциями
               SELECT
                 `ad`.`object_id` AS `objId`,
                 `ad`.`id`        AS `spoId`
               FROM `mx_price__akcii_data` `ad`
             ) `aq` ON aq.objId = obj.id

Запрос корректный, вытягивает 36 строк. Уникальным получается не pk, а spoId - id акции.

пробую вывести через DataProvider

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

        $dataProvider = Yii::createObject([
            'class' => ActiveDataProvider::class,
            'query' => $query,
            'key' => function ($model) {
                return $model->spoId;
            }
        ]);
Как я не пытался указать key (явно или через конфиг),
http://www.yiiframework.com/doc-2.0/gui ... -with-keys
даже делал $dataProvider->prepare(true);

все равно выводит только уникальные объекты.
Самое интересное -

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

            $models = $dataProvider->getModels();
            echo $dataProvider->getTotalCount(); // дает 36
            echo count($models); // выводит 28 уникальных
и в summary также пишет - Показаны записи 1-28 из 36

Может, кто знает, как пофиксить?

Loveorigami
Сообщения: 953
Зарегистрирован: 2014.08.27, 21:54

Re: Key в Active Data Provider

Сообщение Loveorigami » 2017.03.01, 14:34

В общем, докопался ).
- $query->column() показало 36
- $query->all() показало 28

далее просмотрев этот метод, обратил внимание на метод populate($rows), который заполнял массив моделей. Так вот - заполнялись они по id объекта.

решение - нужно добавить $query->indexBy("spoId")->all();

и можно не указывать key в Active Data Provider

Ответить