SQL/Laravel: Получение родителей в древовидной структуре данных
Всем привет) Использую Laravel, MariaDB.
К примеру есть у нас такая таблица, допустим categories.
id | name | _lft | _rgt | parent_id | path | is_folder |
---|---|---|---|---|---|---|
1373 | Окна | 1 | 10 | NULL | 1373 | 1 |
1374 | Стеклопакет | 2 | 7 | 1373 | 1373.1374 | 1 |
1375 | Фурнитура | 8 | 9 | 1373 | 1373.1375 | 1 |
1376 | Установка | 3 | 4 | 1374 | 1373.1374.1376 | 0 |
1377 | Регулировка | 5 | 6 | 1374 | 1373.1374.1377 | 0 |
Модель Categories использует трейт Kalnoy\Nestedset\NodeTrait. В коде ниже билдер запроса уже содержит базовые фильтры (например по name)
if (!empty($filters['recursiveSearch']) && CommonService::parseBoolean($filters['recursiveSearch']) === true) {
/** @var QueryBuilder $query */
}
Нужно чтобы при передаче параметра recursiveSearch выводились не только подходящие под фильтр значения, но и все их родители.
Например: по фильтру name=регулир получим строку Регулировка. при recursiveSearch также нужно получить Окна и Стеклопакет.
Изначально я думал сделать просто with('ancestors')
, но результат попадает в релейшны, а должен в основной запрос.
Потом я сделал доп запрос, получил результат первой выборки, получил pluck('ancestors')
и уже их айдишники подставил в результирующий запрос. Это сработало, но если в первоначальной выборке будет к примеру 1000 записей и у каждой по 3 родителя то в итоге будет where на 3000 айди.
Также в запросе может быть фильтр parentId. Если parentId=null&name=регулир&recursiveSearch=true
то должно вернуть Окна
Прошу помощи :)