Конвертировать запрос NOT EXISTS в Laravel Eloquent - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть красноречивая модель Skill, которая является иерархическим элементом, использующим реализацию таблицы замыканий .

Как часть моего приложения, я хочу иметь возможность получить все листья, где 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 Ответ

2 голосов
/ 02 февраля 2020

Используйте ->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')
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...