【发布时间】: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 查询构建器来实现这一点。谢谢。
【问题讨论】:
-
您是否在寻找 Advanced Wheres?我认为这可能会帮助您实现查询:laravel.com/docs/4.2/queries#advanced-wheres
-
谢谢,效果很好。
标签: mysql laravel eloquent operator-keyword operator-precedence