thinkphp icon indicating copy to clipboard operation
thinkphp copied to clipboard

withJoin 和 withCount 同时使用时报SQL字段出错

Open byoukinn opened this issue 6 years ago • 1 comments

使用以下关联查询

HomeworkModel::withJoin([
    'user' =>	['name', 'id'],
    'attachment' => ['name'],
    ], 'LEFT')
->withCount('file')
->selectOrFail();

生成了以下sql

SELECT 
`homework_model`.`id`,
`homework_model`.`title`,
`homework_model`.`desc`,
`user`.`name` AS `user__name`,
`user`.`id` AS `user__id`,
`attachment`.`name` AS `attachment__name`,

(SELECT COUNT(*) AS tp_count 
FROM `hw_file` `count_table` 
WHERE  ( `count_table`.`hid` = hw_homework.id ) LIMIT 1)

AS `file_count` 
FROM `hw_homework` `homework_model` 

LEFT JOIN `hw_user` `user` ON `homework_model`.`uid`=`user`.`id` 
LEFT JOIN `hw_file` `attachment` ON `homework_model`.`attachment_id`=`attachment`.`id` LIMIT 100

报错 1054 - Unknown column 'hw_homework.id' in 'where clause' 原因 在from语句后已重命名hw_homework表为 homework_model 再子查询就会找不到hw_homework 尝试过更换withJoin()位置,没有生效。

使用with()代替withJoin(),但没办法使用查询多个需要关联的模型。

HomeworkModel::with([
    'user' =>	['name', 'id'],
    'attachment' => ['name'],
    ])
->withCount('file')
->selectOrFail();

报错Too few arguments to function think\db\Query::name(), 0 passed and exactly 1 expected 检查sql语句,生成如下

SELECT *,(SELECT COUNT(*) AS tp_count FROM `hw_file` `count_table` WHERE ( `count_table`.`hid` =hw_homework.id ) LIMIT 1) AS `file_count` FROM `hw_homework`

byoukinn avatar May 05 '19 18:05 byoukinn

解决方案,使用内嵌函数的方式获取字段

HomeworkModel::with([
                    'user' => function($query) {
                        $query->field('id, name');
                    },])

缺点,多次使用了select *COUNT(*)、子查询,难以优化。

byoukinn avatar May 05 '19 18:05 byoukinn