Страница 1 из 1

getTotalCount для DataProvider показывает неправильный результат

Добавлено: 2021.06.09, 18:24
porcelanosa
$dataProvider один и тот же - это копи-паст из реального проекта. Строчки идут одна за одной.

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

$totalCount = $dataProvider->getTotalCount(); //415
$all = $dataProvider->query->all(); // 270
Казалось бы простейший код.
Но результат разный.
С чем это может быть связано?

Re: getTotalCount для DataProvider показывает неправильный результат

Добавлено: 2021.06.09, 18:27
german.igortcev
$query датапровайдера покажите

Re: getTotalCount для DataProvider показывает неправильный результат

Добавлено: 2021.06.09, 20:15
rak
можно поставить модуль yii2-debug и посмотреть какие там генерируются запросы

Re: getTotalCount для DataProvider показывает неправильный результат

Добавлено: 2021.07.09, 13:34
porcelanosa
german.igortcev писал(а): 2021.06.09, 18:27 $query датапровайдера покажите

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

$query = ProductModel::find();
            $query->innerJoinWith(['userListItems']);
            $query->asArray();
            $query->andFilterWhere(['in', 'list_id', $this->list_ids]);
Связь простейшая.

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

public function getUserProductListItems() {
            return $this->hasMany(UserProductListItem::class, ['product_id' => 'id']);
        }
rak писал(а): 2021.06.09, 20:15 можно поставить модуль yii2-debug и посмотреть какие там генерируются запросы
Стоит - вот запросы:
Тут еще одна связь добавлена, но после опубликования вопроса.

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

	
SELECT COUNT(*) FROM `product` INNER JOIN `user_product_list_item` ON `product`.`id` = `user_product_list_item`.`product_id` INNER JOIN `instore_markup` ON `product`.`department_id` = `instore_markup`.`department_id` WHERE (`list_id` IN ('3', '5', '7', '8', '11', '12', '13', '14', '15')) AND (`system_status` != 'deleted') AND (`system_status` NOT IN ('deleted', 'del_candidate')) AND (`product`.`status` != 'deleted')

SELECT `product`.* FROM `product` INNER JOIN `user_product_list_item` ON `product`.`id` = `user_product_list_item`.`product_id` INNER JOIN `instore_markup` ON `product`.`department_id` = `instore_markup`.`department_id` WHERE (`list_id` IN ('3', '5', '7', '8', '11', '12', '13', '14', '15')) AND (`system_status` != 'deleted') AND (`system_status` NOT IN ('deleted', 'del_candidate')) AND (`product`.`status` != 'deleted')

Re: getTotalCount для DataProvider показывает неправильный результат

Добавлено: 2021.07.09, 13:39
porcelanosa
https://prnt.sc/19pl7id
вот результаты запроса

Re: getTotalCount для DataProvider показывает неправильный результат

Добавлено: 2021.07.09, 15:39
unknownby
porcelanosa писал(а): 2021.07.09, 13:39 https://prnt.sc/19pl7id
вот результаты запроса
Проблема в $dataProvider явно
Проверил на своем проекте и оба варианта выдали одинаковый результат

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

var_dump($dataProvider->getTotalCount()); //39
var_dump($dataProvider->query->count()); //39
Хотя в запросе 5 джоинов, два условия

Re: getTotalCount для DataProvider показывает неправильный результат

Добавлено: 2021.07.12, 10:41
ladserg
INNER JOIN возвращает пересечение данных, т.е. количество строк может быть меньше чем в каждой из таблиц. getTotalCount() похоже просто возвращает количество строк в таблице, без учета пересечения. Возможно дело в этом.