【问题标题】:Convert MariaDB SQL into Laravel Query将 MariaDB SQL 转换为 Laravel 查询
【发布时间】:2019-12-21 15:02:30
【问题描述】:

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

我的代码现在可以工作了,但你可以寻找人们的答案,它更简洁。

【问题讨论】:

    标签: sql laravel laravel-query-builder mariadb-10.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();
    

    请注意,此答案假定给定类别只有一个父类别。如果不是,那么我的左连接方法可能会产生重复。一种解决方法是在WHERE 子句中使用EXISTS 查询。

    【讨论】:

    • SQL 错误 (1064):您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 11 行的“tc2.cat_id IS NOT NULL)”附近使用正确的语法。
    • 抱歉,缺少一个 OR(请记住,我无法测试我的代码……只有你可以这样做)。
    • 您的原始 sql 正在运行。我在数据库中的结构是 Department->Category->Subcategory 并且您的代码更清晰。我将尝试实现查询生成器方法并将其标记为正确答案。
    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2019-09-23
    相关资源
    最近更新 更多