在gridview yii2中合并基于列的关系表

时间:2016-10-26 20:45:06

标签: php gridview yii2

index.php中的

'columns' => [
     ['class' => 'yii\grid\SerialColumn'],
       'ID_REQUEST',
       'NOMOR_SURAT',
       [
          'label' => 'Nama Depan',    
          'attribute' => 'ID_KARYAWAN',
          'value' => 'iDKARYAWAN.FIRST_NAME'
       ],
       [
          'label' => 'Nama Belakang',
          'attribute' => 'ID_KARYAWAN',
          'value' => 'iDKARYAWAN.LAST_NAME'
       ],

iDKARYAWAN是我模型中另一个表的关系

class Request extends \yii\db\ActiveRecord {

/**
 * @inheritdoc
 */
public static function tableName() {
    return 'ytms_it.request';
}

 public function getIDKARYAWAN() {
    return $this->hasOne(Karyawan::className(), ['ID_KARYAWAN' => 'ID_KARYAWAN'])->from(Karyawan::tableName(). ' b');
}

如何合并这两列?

对于elp,谢谢。

1 个答案:

答案 0 :(得分:1)

在相关模型中创建名为getFullName()的方法,并使用PHP连接计算全名:

use yii\helpers\Html;

...

/**
 * @return string
 */
public function getFullName()
{
    return Html::encode($this->name . ' ' . $this->surname);
}

可选择在相关模型的attributeLabels()方法中为其定义标签:

`fullName` => 'Label for full name',

然后在GridView中,可以在一列中显示相关模型的全名,如下所示:

1)最短的形式:

'relatedModel.fullName',

2)覆盖标签:

[
    'attribute' => 'relatedModel.fullName',
    'label' => 'Overrided label',
],

3)使用闭包:

[
    'attribute' => 'relatedModel.fullName', // The attribute name can be different in this case
    'value' => function ($model) {
        // You can calculate full name here.
        // But it's better to just call according method since view is only for display.
        return $model->author->fullName; 
    },
],

另一种方法是使用SQL计算全名,并将其作为查询结果的一部分包含在单独的列中。

使用Active Record - Selecting extra fields官方文档部分作为指南,另请参阅Github上的相关问题 - JoinWith - assign a column aliases to an attribute of related model

添加$fullName作为相关模型类的公共属性。像这样修改查询:

use yii\db\Expression;

...

->joinWith(['relatedModel' => function (\yii\db\ActiveQuery $query) {
    $query->addSelect('fullName' => new Expression("CONCAT(name, ' ', surname)")]);
}]

然后要在GridView列中显示它,您可以使用上面提到的选项之一,例如:

'relatedModel.fullName'