将NOT EXISTS查询转换为Laravel口才

时间:2020-02-02 07:44:15

标签: mysql laravel eloquent

我有一个雄辩的模型,叫做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?>)
        });

如何成功转换此查询?

1 个答案:

答案 0 :(得分:2)

使用->from()方法内的whereNotExistswhereColumn检查两个字段是否相同:

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')
        });