Skip to content
This repository has been archived by the owner on Jan 4, 2020. It is now read-only.

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

Open
byoukinn opened this issue May 5, 2019 · 1 comment
Open

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

byoukinn opened this issue May 5, 2019 · 1 comment

Comments

@byoukinn
Copy link

byoukinn commented May 5, 2019

使用以下关联查询

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
Copy link
Author

byoukinn commented May 5, 2019

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

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

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

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant