Конвертировать 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 пункт.

Другие вопросы по тегам