Laravel - 忽略条件的地方

时间:2017-09-19 20:52:35

标签: sql laravel

我正在使用Laravel 5.2

我构建了一个查询来检索一些订单。 该查询最多可以使用三个过滤器

  1. 订单类型
  2. 订单状态
  3. 关键字(来自用户的输入)
  4. 场合

    如果用户过滤了order type和/或order status,则说明工作正常。

    问题

    如果一个过滤器仅获取sent订单但输入Anna,则会获得Type B订单,因为它是in progress

    问题

    我知道这是由与添加whereorWhere相关的内容引起的,但我无法找到解决方案。

    数据

    +------------+--------------+----------+--+
    | Order type | Order status | Username |  |
    +------------+--------------+----------+--+
    | Type A     | Sent         | Jack     |  |
    | Type B     | In Progress  | Anna     |  |
    +------------+--------------+----------+--+
    

    查询

     if (request()->has('order_type')) {
         $orderLines->where('orders.order_type',  request('order_type'));
     }
    
    if (request()->has('order_status')) {
         $orderLines->where('order_status.name',  request('order_status'));
    }
    
    if (request()->has('keyword')) {
        $orderLines->where('order_line_items.last_activity','like', '%'.request('keyword') .'%')
            ->orWhere('users.first_name','like', '%'.request('keyword') .'%')
            ->orWhere('users.last_name','like', '%'.request('keyword') .'%')
            ->orWhere('users.username','like', '%'.request('keyword') 
    }
    

2 个答案:

答案 0 :(得分:0)

您应该将闭包传递给orWhere,以便能够将括号中的语句分组。像这样:

$orderLines->where('order_line_items.last_activity','like', '%'.request('keyword') .'%')
    ->orWhere(function ($query) {
        $query->orWhere('users.first_name','like', '%'.request('keyword') .'%')
              ->orWhere('users.last_name','like', '%'.request('keyword') .'%')
              ->orWhere('users.username','like', '%'.request('keyword') 
    })

在文档here中阅读更多内容。 Parameter Grouping部分。

答案 1 :(得分:0)

if (request()->has('keyword')) {
        $orderLines->where(function ($query) {
                $query->orWhere('order_line_items.last_activity','like', '%'.request('keyword') .'%')
                    ->orWhere('users.first_name','like', '%'.request('keyword') .'%')
                    ->orWhere('users.last_name','like', '%'.request('keyword') .'%')
                    ->orWhere('users.username','like', '%'.request('keyword') .'%')
        }
}