2015-02-05 3 views
0

У меня есть 3 таблицы, play, user и user_play, которая является таблицей соединений для других (все модели были сгенерированы с помощью gii, и они имеют отношения и так на). Мне нужно получить данные из таблицы воспроизведения на основе пользователя (где user id = x) и отправить его в gridview.Yii2 Получение данных из 2 таблиц, подключенных через таблицу соединений в 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

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

+0

Как именно вы хотите отобразить его? Также добавьте код рендеринга GridView. – arogachev

+0

Извините, отредактировал вопрос, в основном все атрибуты таблицы Play с некоторыми атрибутами таблицы user_play. – vrt1515

+0

Не могли бы вы добавить структуру таблиц и полную трассировку стека? – arogachev

ответ

0

Структура, которую вы создали, выглядит правильно, поэтому давайте поговорим об этом. Вы начинаете с пользователя. Ваша модель пользователя имеет отношения «многие ко многим» с «Плейс», определенные через таблицу 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-> play), foreach ($ user-> играет как $ play) и т. д. и т. д. Я не уверен, что вы имеете в виду об атрибуте group, нам нужно будет увидеть код знайте, что вы имеете в виду. Если вам нужны более сложные функции для работы с нашими данными, вам необходимо определить их как методы get в вашей модели. Yii2 documentation объясняет немного подробнее.

2

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

Хитрость заключается в том, чтобы использовать ArrayDataProvider вместо ActiveDataProvider, то он работает :)

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

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