【问题标题】:yii2: how to add a column in index ( GridView ) with innerjoinyii2:如何使用 innerjoin 在索引( GridView )中添加一列
【发布时间】:2016-01-26 06:15:19
【问题描述】:

我想在 GridView::widget 中添加一列

 <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'id',
            'owner_id',
            'situation',
            'address',
              [
//            'attribute' => 'address',
            'format' => 'html',
            'label' => 'Image',
            'value' => function ($data) {
                return Html::img('http://iicity.ir/' . $data['address'],
                    ['width' => '60px']);
            },
        ],

            'slideshow_text',

            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>

我想从另一个表中添加 'owner_id', 的名称 名称在(帐户)表中 表:

id=1 名称=杰克

id=2 name=sara

【问题讨论】:

    标签: php mysql yii yii2


    【解决方案1】:

    @suibber 的接受的答案:

    [
        'attribute' => 'owner_id',
        'value'=>function ($model) {
            $info = Account::findOne(['id' => $model->owner_id]);
    
            return isset($info->name) ? $info->name : $model->owner_id;
        },
    ],
    

    有一些问题:

    1) 构造 SQL 查询逻辑暴露在视图中,因此违反了 MVC 原则。视图仅用于显示数据。

    2) 所有相关所有者的数据都是延迟加载的,即查询量乘以表中显示的行数。

    3) 如果记录不存在,为什么要显示owner_id?这只是意味着数据已损坏。您甚至不应该在这里检查所有者是否存在,因为从逻辑上讲它应该始终存在,您需要在保存之前执行验证,并且在缺少外键的情况下不要使用手动编写的 SQL 查询(或使用 GUI 工具)删除数据。

    4) IDE 缺少自动完成功能。

    Yii2 解决这个问题的方法显然是使用关系。

    将此添加到您的模型中:

    <?php
    
    namespace app\models;
    
    use app\models\User;
    use yii\db\ActiveRecord;
    
    /**
     * ...
     *
     * @property User $owner
     */
    class Picture extends ActiveRecord
    {
        /**
         * @return \yii\db\ActiveQuery
         */
        public function getOwner()
        {
            return $this->hasOne(User::className(), ['id' => 'owner_id']);
        }
    }
    

    然后在GridView中显示所有者名称:

    [
        'attribute' => 'owner_id',
        'value'=>function ($model) {        
            /* @var $model app\models\Picture */
    
            return $model->owner->name;
        },
    ],
    

    或者只是:

    'owner.name',
    

    优点很明显 - 它是框架方式,代码更短,更易读,可以在 ActiveQuery 中使用 -&gt;with('owner') 快速加载数据,以获取 GridView

    顺便说一句,不需要INNER JOIN。相关数据通过单独的 SQL 查询获取。如果出于某种原因,所有者是可选的并且不能存在于某些记录中,请使用:

    [
        'attribute' => 'owner_id',
        'value'=>function ($model) {        
            /* @var $model app\models\YourModel */
    
            return $model->owner ? $model->owner->name : null;
        },
    ],
    

    official docs 很好地介绍了使用相关数据,所以这是一个非常基本的问题。首先检查文档。

    【讨论】:

      【解决方案2】:
      use app\models\Account;
      
      ...
      
      [
          'attribute' => 'owner_id',
          'value' => function ($model) {
              $info = Account::findOne(['id' => $model->owner_id]);
      
              return isset($info->name) ? $info->name : $model->owner_id;
          },
      ],
      

      【讨论】:

      • 谢谢,但我仍然无法解决我的问题!我不知道这里的条件怎么写!
      • 两张表是什么关系?
      • select account.co_name from slideshow_pics , account where slideshow_pics.owner_id=account.id
      • 我编辑了我的答案,如果当前模型是 slideshow_pics 可能是对的
      • 这个解决方案绝对不是 Yii2 解决这个问题的方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多