我有一个雄辩的模型,叫做Skill
,它是使用closure table实现的分层元素。
作为我的应用程序的一部分,我希望能够获得isCategory = false
所在的所有叶子。我可以在mysql中使用以下“原始”查询来实现此目标:
SELECT *
FROM 56574730041811ea9fcb0800279ee528.skills a
WHERE
a.isCategory <> true AND
NOT EXISTS(SELECT uuid, parent_uuid, isCategory
FROM 56574730041811ea9fcb0800279ee528.skills b
WHERE b.parent_uuid <> 'null' AND
b.parent_uuid = a.uuid
);
我想将其转换为Laravel查询生成器查询,但是我不确定如何实现b.parent_uuid = a.uuid
子句。例如:
Skill::where('isCategory', false)
->whereNotExists(function($query) {
$query->select('uuid', 'parent_uuid')
->whereNotNull('parent_uuid')
->where('parent_uuid', '=', <How to reference the outer query?>)
});
如何成功转换此查询?
答案 0 :(得分:2)
使用->from()
方法内的whereNotExists
和whereColumn
检查两个字段是否相同:
Skill::where('isCategory', false)
->whereNotExists(function($query) {
$query->select('uuid', 'parent_uuid', 'isCategory')
->from('skills AS b')
->whereNotNull('b.parent_uuid')
->whereColumn('b.parent_uuid', 'skills.uuid')
});