【问题标题】:Laravel Multiple WHERE() Operator PrecedenceLaravel 多个 WHERE() 运算符优先级
【发布时间】:2014-12-02 23:13:21
【问题描述】:

我使用 Eloquent 编写了以下查询:

Contact::select(DB::raw("DATE_FORMAT(DATE(`created_at`),'%b %d') as date"))
                                 ->addSelect(DB::raw("`created_at`"))
                                 ->addSelect(DB::raw("COUNT(*) as `count`"))
                                 ->where('created_at', '>', $date)
                                 ->ofType($type)
                                 ->groupBy('date')
                                 ->orderBy('created_at', 'ASC')
                                 ->lists('count', 'date');

您可以看到它使用了查询范围方法ofType() 这是该方法,它只是在查询中添加了一堆额外的 where 子句:

return $query->where('list_name', '=', 'Apples')
            ->orWhere('list_name', '=', 'Oranges')
            ->orWhere('list_name', '=', 'Pears')
            ->orWhere('list_name', '=', 'Plums')
            ->orWhere('list_name', '=', 'Blueberries');

最终这会产生以下真实的 SQL 查询:

SELECT DATE_FORMAT(DATE(`created_at`),'%b %d') as date,`created_at`, COUNT(*) as `count` 
FROM `contacts` 
WHERE `created_at` > '2014-10-02 00:00:00' 
AND `list_name` = 'Apples' 
OR `list_name` = 'Oranges' 
OR `list_name` = 'Pears' 
OR `list_name` = 'Plums' 
OR `list_name` = 'Blueberries' 
GROUP BY `date` 
ORDER BY `created_at` ASC

问题是,当 OR 子句启动时,WHERE created_at > '2014-10-02 00:00:00' 子句被遗漏了。由于运算符优先级。我需要将第一个 AND 之后的所有子句都用括号括起来,如下所示:

 SELECT DATE_FORMAT(DATE(`created_at`),'%b %d') as date,`created_at`, COUNT(*) as `count` 
    FROM `contacts` 
    WHERE `created_at` > '2014-10-02 00:00:00' 
    AND 
   (`list_name` = 'Apples' 
    OR `list_name` = 'Oranges' 
    OR `list_name` = 'Pears' 
    OR `list_name` = 'Plums' 
    OR `list_name` = 'Blueberries')
    GROUP BY `date` 
    ORDER BY `created_at` ASC

所以,我的问题是,我将如何使用 eloquent 查询构建器来实现这一点。谢谢。

【问题讨论】:

标签: mysql laravel eloquent operator-keyword operator-precedence


【解决方案1】:

感谢 mOrsa,我通过更改我的查询范围方法来利用高级 where:

return $query->where(function($query){

          $query->orWhere('list_name', '=', 'Apples')
                ->orWhere('list_name', '=', 'Oranges')
                ->orWhere('list_name', '=', 'Pears')
                ->orWhere('list_name', '=', 'Plums')
                ->orWhere('list_name', '=', 'Blueberries');
        });

我得到了想要的 SQL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-12
    • 2023-04-03
    • 2011-07-07
    • 2011-12-29
    • 2011-06-21
    • 2013-02-24
    相关资源
    最近更新 更多