Конвертировать MariaDB SQL в Laravel Query
Это рабочий SQL в MariaDB:
SELECT * FROM ticket_categories
WHERE cat_name LIKE '%test%'
AND
( cat_parent_id = 236
OR cat_id = 236
OR cat_parent_id
IN (SELECT cat_id FROM ticket_categories Where cat_parent_id = 236)
)
Что у меня есть в Laravel Query до сих пор:
$categoryList->where('ticket_categories.cat_name','like','%'.$request->input('name_filter').'%')
->where(function($query) use($request) {
query->where('ticket_categories.cat_parent_id', '=', $request->input('departments_filter'));
$query->orWhere('ticket_categories.cat_id','=', $request->input('departments_filter'));
$query->orWhereIn('ticket_categories.cat_parent_id', function($query1) use ($request) {
$query1->select('cat_id')
->from(with(new TicketCategory)->getTable())
->where('cat_parent_id', '=', $request->input('departments_filter'));
});
});
Мой код сейчас работает, но вы можете искать ответы людей, которые намного чище.
1 ответ
Во-первых, я бы переписал ваш необработанный запрос MariaDB следующим образом:
SELECT *
FROM ticket_categories tc1
LEFT JOIN ticket_categories tc2
ON tc1.cat_parent_id = tc2.cat_id AND
tc2.cat_parent_id = 236
WHERE
tc1.cat_name LIKE '%test%' AND
(
tc1.cat_parent_id = 236 OR
tc1.cat_id = 236 OR
tc2.cat_id IS NOT NULL
);
Это будет соответствовать следующему коду Laravel:
$results = DB::table('ticket_categories tc1')
->leftJoin('ticket_categories tc2', function($join) {
$join->on('tc1.cat_parent_id', '=', 'tc2.cat_i ');
$join->on('tc2.cat_parent_id', '=', 236);
->where('tc1.cat_name', 'like', '%test%')
->where(function($q) {
$q->where('tc1.cat_parent_id', 236)
->orWhere('tc1.cat_id', 236)
->OrWhereNotNull('tc2.cat_id')
})
->get();
Обратите внимание, что этот ответ предполагает, что в данной категории будет только один родитель. Если нет, то мой подход левого соединения может генерировать дубликаты. Обходной путь будет использовать EXISTS
запрос в WHERE
пункт.