先说一个讨巧的办法
用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' ],//<=====加入这