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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

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

Сообщение porcelanosa »

$dataProvider один и тот же - это копи-паст из реального проекта. Строчки идут одна за одной.

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

$totalCount = $dataProvider->getTotalCount(); //415
$all = $dataProvider->query->all(); // 270
Казалось бы простейший код.
Но результат разный.
С чем это может быть связано?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
german.igortcev
Сообщения: 251
Зарегистрирован: 2014.08.18, 14:01

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

Сообщение german.igortcev »

$query датапровайдера покажите
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

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

Сообщение rak »

можно поставить модуль yii2-debug и посмотреть какие там генерируются запросы
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

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

Сообщение 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')
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

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

Сообщение porcelanosa »

https://prnt.sc/19pl7id
вот результаты запроса
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

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

Сообщение unknownby »

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

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

var_dump($dataProvider->getTotalCount()); //39
var_dump($dataProvider->query->count()); //39
Хотя в запросе 5 джоинов, два условия
ladserg
Сообщения: 8
Зарегистрирован: 2012.05.04, 12:02

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

Сообщение ladserg »

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