今天自己做一个小demo,为了不要冗余字段,需要进行多表联合查询、搜索
yii中,用model来映射数据库(其实好多框架都是这么搞的),一个模型类通常有一个search模型类跟着一起
废话不多说了,首先,数据库里有布置一张表,我习惯让数据表之间相互独立,建表的时候没有添加外键约束,而是采用 u_id、a_id 等字段来表示关联关系;
下图是我设计表格中常常包括的字段
上面的表为一个join报名表,u_id是报名用户的id,j_id是报名项目的id,a_id是该项目负责人的id,分别关联了三张表
通过Gii生成的默认首页表单不包括其他三张表的内容,这里不赘述,要实现如下效果:
需要对如下几个文件进行修改:
- 本页对应model、修改是增加相应的get方法
- 对应的modelSearch、修改是把关联加进去,用于搜索
- 首页视图的修改,替换原来的U ID、J ID、A ID等
一、修改model,增加get方法
yii中,get方法实际上可以理解成往model对象中增加新的属性、方法,也就是添加与其他表的映射关系
/*** 根据u_id获取用户信息*/public function getUser(){return $this->hasOne(User::className(), ['id' => 'u_id']);}
二、修改modelSearch,加入关联查询
...其他代码...//增加成员属性(增加的查询字段)public $real_name;
//在ruler规则中添加
[['real_name'], 'safe'],
//在search方法中
...
//增加查询表 也就是要和哪张表一起查
$query->joinWith(['user']);
...
$query->andFilterWhere(['like', 'user.real_name', $this->real_name]);
...
//设置搜索同时给新增的选项添加排序规则
//注意是重写,所以要加上原来有的项目
$dataProvider->setSort(['attributes' => [
'id',
'expectation',
'work_time',
'status',
'real_name' => [
'asc' => ['user.real_name' => SORT_ASC],
'desc' => ['user.real_name' => SORT_DESC],
'label' => 'user.real_name' ],
]
]
]);
return $dataProvider;
setSort是为在首页表上显示的字段提供排序的规则,它自己的有,新加入的需要添加一下,会覆盖原有的,所以模型本来的字段不能漏,否则无法按该字段排序
三、修改view
看代码,这个是视图文件中的index.php文件,也就是修改GridView
<?= GridView::widget(['dataProvider' => $dataProvider,'filterModel' => $searchModel,'columns' => ['id',//'u_id', ['attribute' => 'real_name','value' => 'user.real_name','label' => '用户'],'expectation','work_time','status',['class' => 'yii\grid\ActionColumn'],],]); ?>
这样就可以搜索了,也可以排序的哦
文笔不好,有不妥当之处欢迎交流 ^_^