Yii2 Получение данных из 2 таблиц, соединенных через соединительную таблицу, в gridview

У меня есть 3 таблицы: play, user и user_play, которая является связующей таблицей для других (все модели были сгенерированы с помощью gii, и у них есть отношения и т. д.). Мне нужно получить данные из таблицы воспроизведения на основе пользователя (где идентификатор пользователя = x) и отправить их в gridview.

Я также хотел бы отобразить некоторые данные из таблицы user_play, например атрибут группы, и подсчитать всех игроков, зарегистрировавшихся в игре:

 <?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],
        'name',
        'date',
        'user_play.group',
        'user_play.userCount',
        'time',
        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

У меня есть это отношение в моем пользовательском и игровом столе:

 public function getUserPlays()
{
    return $this->hasMany(UserPlay::className(), ['user_id' => 'id']);
}

У меня также есть аналогичные отношения в пользовательском и игровом столе:

//user table
public function getPlay() 
{
    return $this->hasMany(Play::className(), ['id' => 'play_id'])
    ->via('userPlays');
}
//play table
public function getUser() 
{
    return $this->hasMany(User::className(), ['id' => 'user_id'])
    ->via('userPlays');
}

Я не знаю, как использовать два вышеупомянутых отношения, может ли кто-нибудь объяснить мне это или, может быть, опубликовать ссылку с некоторой информацией, пожалуйста? Ничего не могу найти в инете.

Но эта строка кода дает мне то, что я хочу, а именно данные из таблицы воспроизведения для конкретного пользователя:

   $plays = Play::find()
     ->joinWith(['userPlays'])
     ->where(['user_play.user_id' => Yii::$app->user->id])
     ->all();

Но когда я пытаюсь поместить этот вывод в поставщик данных, я получаю сообщение об ошибке: Call to a member function getCount() on a non-object

Как я могу отправить эти данные поставщику данных gridview и отобразить их? Или, может быть, есть более простой способ получить нужные мне данные? Пожалуйста помоги.


person vrt1515    schedule 05.02.2015    source источник
comment
Как именно вы хотите его отобразить? Также добавьте код рендеринга GridView.   -  person arogachev    schedule 05.02.2015
comment
Извините, отредактировал вопрос, в основном все атрибуты таблицы Play с некоторыми атрибутами таблицы user_play.   -  person vrt1515    schedule 05.02.2015
comment
Не могли бы вы добавить структуру таблиц и полную трассировку стека?   -  person arogachev    schedule 05.02.2015


Ответы (2)


Я знаю в чем проблема, у меня было так же.

Хитрость в том, чтобы использовать ArrayDataProvider вместо ActiveDataProvider, тогда все работает :)

    $dataProvider = new ArrayDataProvider([
    'allModels' => $model->userPlays,
    'sort' => [
        'attributes' => ['id', ...],
    ],
]);

должен сделать это.

person Beate    schedule 19.04.2016

Созданная вами структура выглядит правильно, так что давайте обсудим ее. Вы начинаете с пользователя. Ваша модель User имеет отношения «многие ко многим» с Plays, определенные через таблицу user_plays. В вашей модели пользователя у вас есть это; (Я переименовал функцию, чтобы было понятнее, что вы получаете несколько значений)

 public function getUserPlays()
{
    return $this->hasMany(UserPlay::className(), ['user_id' => 'id']);
}
    public function getPlays() 
{
    return $this->hasMany(Play::className(), ['id' => 'play_id'])
    ->via('userPlays');
}

Любой метод, который начинается со слова «получить», позволяет вам использовать этот метод, как если бы он был атрибутом модели, например. $count = count($user->plays), foreach($user->plays as $play) и т. д. и т. д. Я не уверен, что вы имеете в виду под атрибутом «группа», нам нужен код для знаю, что вы имеете в виду. Если вам нужны более сложные функции для работы с нашими данными, вам нужно определить их как методы get в вашей модели. документация Yii2 объясняет немного подробнее.

person Joe Miller    schedule 05.02.2015