Php yii2:如何使用innerjoin在索引(GridView)中添加列
我想在GridView::widget中添加一列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([
'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;
},
],