先说一个讨巧的办法

用sql关联两张表查询,生成视图,然后对视图进行gii,注意因为视图没有主键,需要在先生成的model表里加上代码手动设置虚拟主键,然后再生成crud代码

namespace app\models;

use yii\db\ActiveRecord;

class YourModel extends ActiveRecord
{
    /**
     * @return string[] the primary key name(s) for this AR class.
     */
    public static function primaryKey()
    {
        return ['id']; // Change to your column name
    }
}

在这个示例中,primaryKey() 方法返回一个包含主键列名的数组。在这个例子中,主键被设置为 id。你可以将 id 更改为你的实际主键列名。

请注意,如果你的主键是一个复合主键(由多个列组成),你可以在数组中包含所有的列名。例如,如果你的主键由 id 和 type 两个列组成,你可以这样写:

public static function primaryKey()
{
    return ['id', 'type'];
}

以下是比较正经的方法

假设有两张表通过id关联,现在想在查询结果里面展示两张表的对应字段,并支持搜索排序功能

前置条件:

gii自动生成的两表的model中有关联关系函数,类似:

 /**
     * @return \yii\db\ActiveQuery
     */
    public function getTest()
    {
        return $this->hasMany(Test::className(), ['DP_ID' => 'dpId']);
    }

第一步,在model和searchmodel里面添加对应的字段名

public $name
并且在rules里面也加上对应规则

第二步,修改searchmodel里面的search($params)函数

添加如下代码

$query->joinWith(['test']);
        $query->select("test_detail.*, test.NAME");
        $query->andFilterWhere(['test.DP_ID' => $this->dpId]);


        $query->andFilterWhere([
            // other params
            'NAME' => $this->NAME,
        ]);

第三步 排序处理

在searchmodel里面的search($params)函数里添加如下代码:

$dataProvider->setSort([
        'attributes' => [
            /* 其它字段不要动 */    
            /*  下面这段是加入的 */
            /*=============*/
            'NAME' => [
                'asc' => ['test.NAME' => SORT_ASC],
                'desc' => ['test.NAME' => SORT_DESC],
                'label' => 'NAME'
            ],
            /*=============*/
        ]
    ]); 

第四步,修改index视图

 <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],
            'dpId',
            ['label'=>'名称',  'attribute' => 'NAME',  'value' => 'NAME' ],//<=====加入这