我有3个表,play,user和user_play,这是其他表的联结表(所有模型都是用gii生成的,它们有关系等等)。我需要根据用户(用户id = x)从play表中获取数据并将其发送到gridview。
我还想显示user_play表中的一些数据,比如group属性,并统计所有注册游戏的玩家:
<?= 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数据提供者并显示它?或者可能有更简单的方法来获取我想要的数据?请帮忙。
答案 0 :(得分:2)
我知道问题是什么,我也一样。
诀窍是,使用ArrayDataProvider而不是ActiveDataProvider,然后它可以工作:)
instance
应该这样做。
答案 1 :(得分:0)
您设置的结构看起来正确,所以让我们来谈谈它。 您是从用户开始的。您的用户模型与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');
}
任何以单词&#39; get&#39;开头的方法允许您使用该方法,就好像它是模型的属性,例如$ count = count($ user-&gt; plays),foreach($ user-&gt; play as play play)等等。我不确定你对这个小组的意思是什么?&#39;属性,我们需要看一些代码才能知道你的意思。如果您需要更复杂的功能来操作我们的数据,那么您需要将这些功能定义为&#39; get&#39;模型中的方法。 Yii2 documentation更详细地解释了这一点。