【问题标题】:How to show has many relation record in Yii2 GridView and DetailView?Yii2 GridView 和 DetailView 中如何显示多个关系记录?
【发布时间】:2024-05-29 15:00:02
【问题描述】:

我想在详细视图和网格视图中展示员工的许多爱好。

但是我遇到了错误异常Trying to get property of non-object

这是我的架构代码模型:

应用\模型\TblDataStaff

    ....
        public function getTblDataHobis()
            {
                return $this->hasMany(TblDataHobies::className(), ['id_staff' => 'id']);
            }

查看代码:查看。

<?= DetailView::widget([
        'model' => $model,
        'attributes' => [
...
['attribute'=>'namHob','value'=>$model->tblDataHobis->id],
...
],
    ]) ?>

索引:

<?= GridView::widget([
        'dataProvider' => $dataProvider,
        //'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
......
['attribute'=>'namHob','value'=>function($namHob){return $namHob->tblDataHobis->name_hobby;},],
.....
['class' => 'yii\grid\ActionColumn'],
        ],]);?>

如何展示员工的众多爱好?

【问题讨论】:

    标签: php gridview yii2 detailview


    【解决方案1】:

    尝试:

    <?= DetailView::widget([
            'model' => $model,
            'attributes' => [
    
             [
                  'header' => 'number of hobbies',
                  'value' => function($data) {
                           return $data->getTblDataHobis()->count();
                  }
              ]
    
        ]) ?>
    

    【讨论】:

      【解决方案2】:

      没什么奇怪的,你有一个 Trying to get property of non-object 错误仅仅是因为 $model-&gt;tblDataHobis 返回一个 TblDataHobies 对象数组。

      你可以试试这个:

      // display hobbies names separated with commas
      echo implode(', ', \yii\helpers\ArrayHelper::map($model->tblDataHobis, 'id', 'name_hobby'));
      

      对于DetailView

      'value' => implode(\yii\helpers\ArrayHelper::map($model->tblDataHobis, 'id', 'name_hobby')),
      

      对于GridView

      'value' => function($model) {
          return implode(\yii\helpers\ArrayHelper::map($model->tblDataHobis, 'id', 'name_hobby')),
      },
      

      【讨论】:

        【解决方案3】:

        只需获取项目数据,然后创建一个简单的 yii2 查询。 例如,我的“工人”有城市 id,有了这个 id,我们可以通过这个 id 找到城市名称。

             <?= DetailView::widget([
                'model' => $model,
                'attributes' => [
                    'id',
                    'name:ntext',
                    'surname:ntext',
                    'fathers',
                    [
                        'attribute' => 'city_id',
                        'value'=> function($data){
                            $city = City::find()->where(['id'=>$data->city_id])->one();
                            $info = $city->name;
                            return $info;
                        },
                        'format'=>'html',
                    ],
                    'status',
                    'street',
                    'in_company',
                ],
            ]) ?>
        

        【讨论】:

        • 仅代码就可以得到相当低质量的答案。你能解释一下你的代码 sn-p 是做什么的吗?