【问题标题】:Yii2 Getting data from 2 tables connected via junction table into gridviewYii2从通过联结表连接的2个表中获取数据到gridview
【发布时间】:2015-02-05 10:00:37
【问题描述】:

我有 3 个表,play、user 和 user_play,它们是其他表的联结表(所有模型都是用 gii 生成的,它们有关系等等)。我需要根据用户(其中​​用户 id = 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 dataprovider 并显示它?或者也许有更简单的方法来获取我想要的数据?请帮忙。

【问题讨论】:

  • 您希望如何显示它?另外请添加GridView渲染代码。
  • 抱歉,编辑了这个问题,基本上所有 Play 表属性都带有一些 user_play 表属性。
  • 你能添加表结构和完整的堆栈跟踪吗?

标签: gridview yii2 dataprovider


【解决方案1】:

我知道是什么问题,我也有同样的问题。

诀窍是,使用 ArrayDataProvider 而不是 ActiveDataProvider,那么它就可以工作了 :)

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

应该这样做。

【讨论】:

    【解决方案2】:

    您设置的结构看起来不错,所以让我们讨论一下。 您从用户开始。您的 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');
    }
    

    任何以“get”开头的方法都允许你使用该方法,就好像它是模型的一个属性一样,例如$count = count($user->plays)、foreach($user->plays as $play) 等等。我不确定你对“组”属性的意思,我们需要查看一些代码知道你的意思。如果您需要更复杂的函数来操作我们的数据,那么您需要在模型中将它们定义为“get”方法。 Yii2 documentation 解释得更详细一些。

    【讨论】:

      猜你喜欢
      • 2021-10-16
      • 1970-01-01
      • 2018-12-21
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多