在雄辩的WHERE条款中选择COUNT

时间:2018-10-20 08:01:36

标签: laravel eloquent

我知道前段时间也有类似情况,但是情况不一样,我不能只是自己想一想。 我需要将原始SQL查询转换为Eloquent。

此查询在WHERE子句中包含SELECT COUNT,为简单起见,我有此查询(可能没有多大意义):

SELECT u.column1, u.column2, u.column3, s.column1 FROM users u
LEFT JOIN salary s ON u.id = s.user_id  
WHERE 
(
SELECT count(cars_id) FROM cars WHERE cars.user_id = u.id
) = 0 
AND u.city IN ("London","Paris")

我尝试过:

$columns = [
        'users.column1',
        'users.column2',
        'users.column3',
        'salary.column1'
        ];

$q = User::select($columns)
    ->leftJoin('salary', 'salary.user_id', '=', 'users.id')
    ->whereRaw(" (SELECT COUNT(cars_id) FROM cars WHERE cars.user_id = u.id) = 0 ")
    ->whereRaw("u.city IN ('London','Paris')") 
    ->get();

但是它不会返回与原始SQL相同的结果(SQL有161行,雄辩的154行)。

也许您知道如何将这种查询正确转换为Eloquent?

谢谢

1 个答案:

答案 0 :(得分:0)

根据您的查询,我相信应该这样做:

DB::table('users as u')
    ->select([ 'u.column1', 'u.column2', 'u.column3', 's.column1'])
    ->leftJoin('salary as s', 'u.id', '=', 's.user_id')
    ->leftJoin('cars as c', 'c.user_id', '=', 'u.id')
    ->whereIn('u.city', ['London', 'Paris'])
    ->havingRaw('count(c.id) = 0')
    ->get();

请让我知道。