使用 Eloquent Laravel 处理多个 "AND" 和 "OR"

Handling multiple "AND"s and "OR"s using Eloquent Laravel

是否可以使用 Eloquent ORM 像下面的示例那样制作 select。

select .. where ... AND ( ( ... AND ...) OR ( ... AND  ... )) 

这是我的"workaround":

$tasks1=$user->Tasks()
->WhereBetween('start_date',array($start,$end))
->where('deleted',0)
->where('dated','=',1)
->where('status','=',$state)
->get();

$tasks2=$user->Tasks()
->WhereBetween('due_date',array($start,$end))
->where('deleted',0)
->where('dated','=',1)
->where('status','=',$state)
->get();

$tasks3=$user->Tasks()
->where('start_date','<',$start)
->where('due_date','>',$end)
->where('deleted',0)
->where('dated','=',1)
->where('status','=',$state)
->get();

$tasks = $tasks1->merge($tasks2);

$tasks = $tasks->merge($tasks3);

如您所见,我只是 运行 多个仅使用 AND 的查询,而将它们合并模拟 OR。

有什么想法吗?谢谢。

您确实可以使用 Laravels Eloquent:

执行分组 and or 查询
$tasks = Tasks::whereBetween('start_date', array($start,$end))
                ->where(function($query)
                {                    
                    ->where(function($q)
                    {
                        $q->where('column_a', 'foo')
                          ->where('column_b', 'bar');
                    })
                    ->orWhere(function($q)
                    {
                        $q->where('column_c', 'foo')
                          ->where('column_d', 'bar');
                    })
                })
                ->get();

这会产生您所描述的查询:

SELECT ... WHERE ... AND ((... AND ...) OR (... AND ...))

有关 Laravel 中高级 where 语句的更多信息,请查看此处的文档:http://laravel.com/docs/4.2/queries#advanced-wheres