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

Вывод таблицы стандартным GridView

Добавлено: 2019.01.30, 12:57
phpCoder88
Всем привет!

В базе есть несколько таблиц: фильмы, актеры и кросстаблица для их соединения. В моделях все связи настроены.

На странице нужно вывести список фильмов и в одной из колонок список актеров для каждого фильма.

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

	$query = Films::find()
            ->joinWith('acters');

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'sort' => [
                'defaultOrder' => [
                    'created_at' => SORT_DESC,
                ]
            ],
        ]);
и вывод

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

echo GridView::widget([
        'dataProvider' => $dataProvider,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

           /*описание колонок*/

            [
                'attribute' => 'acter_names',
                'format' => 'html',
                'value' => function($model){
                    if (empty($model->acters)) {
                        return null;
                    }
		    /*Вывод списка актеров*/
                }
            ],

        ],
    ]);
Все отлично выводится, но строка над таблицей вида "Показаны записи 1-9 из 14." выдает неправильные данные. Фильмов в базе всего 9 и они как раз показываются, а 14 появилась из-за объединения таблиц.
Как сделать, чтобы данные выводились корректные?

Вариант запроса актеров для каждого фильма не подходит.

Re: Вывод таблицы стандартным GridView

Добавлено: 2019.01.30, 14:44
dmg

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

$query = Films::find()
            ->with('acters');

Re: Вывод таблицы стандартным GridView

Добавлено: 2019.01.30, 17:23
Alexum
Почитайте про ->distinct(), есть нюансы.

Re: Вывод таблицы стандартным GridView

Добавлено: 2019.01.31, 17:19
phpCoder88
Спасибо за помощь! С методом with все отлично получилось)))

Re: Вывод таблицы стандартным GridView

Добавлено: 2019.02.04, 20:33
andku83
phpCoder88 писал(а): 2019.01.31, 17:19 Спасибо за помощь! С методом with все отлично получилось)))
если нужно будет добавлять фильтрацию по актерам, тогда ->joinWith() вернется и проблема решится:

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

->groupBy('films.id')

// или

->distinct()   // как было выше сказано