Activerecord Yii2:活动记录-joinWith是否已优化?
请让我从下面的例子开始: 我有三张桌子:Activerecord Yii2:活动记录-joinWith是否已优化?,activerecord,yii2,Activerecord,Yii2,请让我从下面的例子开始: 我有三张桌子: users(id,name,family) roles(id,user_id,chart_id,name,code) chart(id,name) 关系: users-roles = 1-n roles-users = 1-1 roles-chart = 1-1 Yii活动记录类别: class User extends ActiveRecord { public function getRoles(){ return $th
users(id,name,family)
roles(id,user_id,chart_id,name,code)
chart(id,name)
关系:
users-roles = 1-n
roles-users = 1-1
roles-chart = 1-1
Yii活动记录类别:
class User extends ActiveRecord {
public function getRoles(){
return $this->hasMany(Role::className(),['user_id' => 'id']);
}
}
class Role extends ActiveRecord {
public function getUser(){
return $this->hasOne(User::className(),['id' => 'user_id']);
}
public function getChart(){
return $this->hasOne(Chart::className(),['id' => 'chart_id']);
}
}
因此,我需要角色并使用以下代码:
$roles = Role::find()
->select('roles.id,roles.user_id,roles.chart_id,roles.name,roles.code')
->joinWith([
'user' => function($q){
$q->select('id,name,family');
},
'chart' => function($q){
$q->select('id,name');
}
])
->all();
运行此代码时,Yii创建三个查询
第一个问题:
SELECT
`roles`.`id`, `roles`.`user_id`,
`roles`.`chart_id`, `roles`.`name`,
`roles`.`code`
FROM `roles`
LEFT JOIN `users` ON `roles`.`user_id` = `users`.`id`
LEFT JOIN `chart` ON `roles`.`chart_id` = `chart`.`id`
第二个问题:
SELECT `id`, `name`, `family` FROM `users` WHERE `id` IN (1, 3)
第三个问题:
SELECT `id`, `name` FROM `chart` WHERE `id`=1
这是优化的吗
为什么我可以在第一次查询中获得结果
为什么Yii不合并三个查询?如下面的代码所示:
SELECT
`roles`.`id`, `roles`.`user_id`,
`roles`.`chart_id`, `roles`.`name`,
`roles`.`code`,
`chart`.`id`,`users`.`id`,`users`.`name`,`users`.`family`
FROM `roles`
LEFT JOIN `users` ON `roles`.`user_id` = `users`.`id`
LEFT JOIN `chart` ON `roles`.`chart_id` = `chart`.`id`
在最终的sql中,例如有三个“id”字段。Yii如何填充各自的模型(角色、图表和用户)“id”字段?Yii可以为主键使用别名,例如
role.id yiipk1
,也可以使用任何规则。