Php yii2:如何使用innerjoin在索引(GridView)中添加列

Php yii2:如何使用innerjoin在索引(GridView)中添加列,php,mysql,yii,yii2,Php,Mysql,Yii,Yii2,我想在GridView::widget中添加一列 <?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', 'o

我想在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'],
        ],
    ]); ?>

我想从另一个表中添加“所有者id”的名称 名称在(帐户)表中 表:

id=1 name=jack

id=2 name=sara

@suibber接受的答案:

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;
    },
],
[
    '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\u 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']);
    }
}
或者只是:

'owner.name',
优点很明显-这是一种框架方式,代码更短,可读性更强,可以使用
->和('owner')
ActiveQuery
中为
GridView
急切地加载数据

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

[
    'attribute' => 'owner_id',
    'value'=>function ($model) {        
        /* @var $model app\models\YourModel */

        return $model->owner ? $model->owner->name : null;
    },
],

关于处理相关数据的问题,本章有很好的介绍,所以这是一个非常基本的问题。首先查看文档。

谢谢,但我仍然无法解决我的问题!我不知道如何在这里写条件!两个表之间的关系是什么?从slideshow_图片中选择account.co_name,account where slideshow_pics.owner_id=account.idI编辑了我的答案,如果当前模型是slideshow_图片,这可能是正确的。此解决方案显然不是解决此问题的唯一方法。
[
    'attribute' => 'owner_id',
    'value'=>function ($model) {        
        /* @var $model app\models\YourModel */

        return $model->owner ? $model->owner->name : null;
    },
],