我知道前段时间也有类似情况,但是情况不一样,我不能只是自己想一想。 我需要将原始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?
谢谢
答案 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();
请让我知道。