myks92
@myks92
Нашёл решение — пометь вопрос ответом!

Yii2 как убрать дублирование записей в $dataProvider при joinWith()?

Всем привет!) Никак не могу разобраться с данными в dataProvider. Возможно это касается не только его, но и запросов.

Суть такая... Я использую модель ProfileSearch в которой делаю joinWith других таблиц с необходимыми данными (город, регион ....).
$query = Profile::find();
        $query = $this->getTabs($query);

        $query->joinWith(['user', 'city', 'certifications', 'appointments.event'])
            ->leftJoin('auth_assignment','auth_assignment.user_id = profile.user_id');

По ним так же производится сортировка и фильтрация данных.
// grid filtering conditions
        $query->andFilterWhere([
            'id' => $this->id,
            'user_id' => $this->user_id,
            'date_birthday' => $this->date_birthday,
            'city.id' => $this->city_id,
            'gender' => $this->gender,
            'category_id' => $this->category_id,
            'comitet_id' => $this->comitet_id,
            'user.status' => $this->status,
            'auth_assignment.item_name' => $this->type,
            'city.id_district' => $this->district_id,
            'city.id_region' => $this->region_id,
        ]);


Всё это вывожу в с помощью виджета ListView используя dataProvider. После joinWith количество данных увеличилось. К примеру, пользователей в системе 100, а $dataProvider->totalCount показывает 150. Ну это и понятно. Ведь сделали leftJoin других данных. Однако появилась другая проблема. При пагинации страниц появляются дубли пользователей.

5bbe8ec3e6ed1961393094.png

Вопрос:
1. Как мне убрать дублирование записей?
  • Вопрос задан
  • 1122 просмотра
Решения вопроса 2
Чтобы исключить дублирование, надо сгруппировать по идентификаторам профилей
$query->groupBy('id');
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@kuftachev
Когда я мучался с этой проблемой, я решил посмотреть как это делают профессионалы... Посмотрел код сайта yiiframework.com, раздел новости или что-то подобное, там теги к новостям многие ко многим... В итоге... НИКАК! У них тоже все неправильно отображается.

Я в итоге сделал просто отдельный запрос, а потом сам руками мапил. Проблема Yii2, что если не идёшь по тому, что позволяет фреймворк, то потом нужно с ним бороться, хотя пока все ок - все очень быстро пишется.
Ответ написан
@mikxa
Известная проблема дублей при пагинации, в Yii 1 то-же самое. Помогает MultiSort

$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => [
'defaultOrder' => ['id' => SORT_DESC],
'enableMultiSort' => true,
],

]);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы