yii多表查询--学习随笔
今天自己做一個(gè)小demo,為了不要冗余字段,需要進(jìn)行多表聯(lián)合查詢、搜索
yii中,用model來映射數(shù)據(jù)庫(其實(shí)好多框架都是這么搞的),一個(gè)模型類通常有一個(gè)search模型類跟著一起
廢話不多說了,首先,數(shù)據(jù)庫里有布置一張表,我習(xí)慣讓數(shù)據(jù)表之間相互獨(dú)立,建表的時(shí)候沒有添加外鍵約束,而是采用?u_id、a_id?等字段來表示關(guān)聯(lián)關(guān)系;
下圖是我設(shè)計(jì)表格中常常包括的字段
上面的表為一個(gè)join報(bào)名表,u_id是報(bào)名用戶的id,j_id是報(bào)名項(xiàng)目的id,a_id是該項(xiàng)目負(fù)責(zé)人的id,分別關(guān)聯(lián)了三張表
通過Gii生成的默認(rèn)首頁表單不包括其他三張表的內(nèi)容,這里不贅述,要實(shí)現(xiàn)如下效果:
需要對(duì)如下幾個(gè)文件進(jìn)行修改:
一、修改model,增加get方法
yii中,get方法實(shí)際上可以理解成往model對(duì)象中增加新的屬性、方法,也就是添加與其他表的映射關(guān)系
/*** 根據(jù)u_id獲取用戶信息*/public function getUser(){return $this->hasOne(User::className(), ['id' => 'u_id']);}二、修改modelSearch,加入關(guān)聯(lián)查詢
...其他代碼...//增加成員屬性(增加的查詢字段)public $real_name;//在ruler規(guī)則中添加
[['real_name'], 'safe'], //在search方法中
... //增加查詢表 也就是要和哪張表一起查
$query->joinWith(['user']);
... $query->andFilterWhere(['like', 'user.real_name', $this->real_name]);
...
//設(shè)置搜索同時(shí)給新增的選項(xiàng)添加排序規(guī)則
//注意是重寫,所以要加上原來有的項(xiàng)目
$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是為在首頁表上顯示的字段提供排序的規(guī)則,它自己的有,新加入的需要添加一下,會(huì)覆蓋原有的,所以模型本來的字段不能漏,否則無法按該字段排序
三、修改view
看代碼,這個(gè)是視圖文件中的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'],],]); ?>這樣就可以搜索了,也可以排序的哦
文筆不好,有不妥當(dāng)之處歡迎交流 ^_^
轉(zhuǎn)載于:https://www.cnblogs.com/huyujun/p/9604333.html
總結(jié)
以上是生活随笔為你收集整理的yii多表查询--学习随笔的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intel显卡首秀光追渲染:性能保密
- 下一篇: 关于字符串比较时候出现的空指针问题的坑