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
,也可以使用任何规则。