今天自己做一個小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'],],]); ?>
這樣就可以搜索了,也可以排序的哦
文筆不好,有不妥當之處歡迎交流 ^_^