用戶表 user 與認證表 auth 通過 user.id = auth.uid 一對一關聯。需在 User 列表(GridView)顯示 auth.source 並支持搜索過濾。
// common/models/User.php
public function getAuth() {
return $this->hasOne(Auth::className(), ['uid' => 'id']);
}
'columns' => [
// ...
'auth.source', // 直接用關聯路徑
]
Debug 面板顯示:分頁 20 條 → 20 條 SELECT * FROM auth WHERE uid=... SQL,性能差。
// common/models/UserSearch.php
public function search($params) {
$query = User::find();
// 關鍵:joinWith 產生 LEFT JOIN,select 只取需要字段
$query->joinWith(['auth']);
$query->select("user.*, auth.source");
$dataProvider = new ActiveDataProvider(['query' => $query]);
// ... load($params) validate() ...
return $dataProvider;
}
SQL 變為:
SELECT `user`.*, `auth`.`source` FROM `user` LEFT JOIN `auth` ON `user`.`id` = `auth`.`uid` LIMIT 20
只剩 1 條 SQL,性能大幅提升。
public $source; // 虛擬屬性接收搜索值
public function rules() {
return [
// ...
['source', 'safe'], // 允許搜索
];
}
[
'attribute' => 'source',
'value' => 'auth.source',
'label' => '渠道來源',
]
$query->andFilterWhere([
// ...
'auth.source' => $this->source,
]);
| 需求 | 代碼 |
|---|---|
| 對象轉數組 (可 json_encode) | $model->toArray() |
| 按條件查單條並取字段 | User::find()->where(['like','name', $str])->select('id')->scalar() |
| 動態調用 model() | call_user_func([ActiveRecord::className(), 'model']) |
hasOne/hasMany 關聯relation.field 顯示(開發期可接受)toArray() 序列化、scalar() 取單值這套模式可直接套用於任何一對一/一對多關聯的列表顯示與搜索場景。