1

这是 MariaDB 中的工作 SQL:

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

我的代码现在可以正常工作,但是您可以寻找更简洁的人们的答案。

4

1 回答 1

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

于 2019-08-15T05:31:16.703 回答