在Eloquent中构建复杂的WHERE查询

时间:2019-05-31 02:45:15

标签: laravel eloquent

一段时间以来,我一直对此感到烦恼,但我无法弄清楚(即使我知道这可能很简单)。我正在Laravel中迈出第一步,我想使用Eloquent建立这样的查询。

// This should be condition one
WHERE status NOT IN (4,99)

OR

// condition two
status NOT IN (4,99) AND ('column1' LIKE %XXXX% OR 'column2' LIKE %XXXX%)

我正在这样做:

$q->whereNotIn('order_stage_id', [99, 4])
->orWhere(function ($query) {
    $query->whereNotIn('order_stage_id', [99, 4])
        ->orWhere('reference_number', 'like', '%'.$request->key.'%')
        ->orWhere('seller_remark', 'like', '%'.$request->key.'%')
        ->orWhere('companies.name', 'like', '%'.$request->key.'%')
        ->orWhere('users.name', 'like', '%'.$request->key.'%');
});

1 个答案:

答案 0 :(得分:1)

根据您雄辩的代码,您当前的查询如下所示:

WHERE order_stage_id NOT IN (4,99) OR ( WHERE order_stage_id NOT IN (4,99) OR reference_number LIKE %XXXX% OR ...)

您需要使用where()方法来获取SQL AND运算符,然后使用闭包嵌套orWhere()方法。

$q->whereNotIn('order_stage_id',[99,4])
    ->orWhere(function($query) {

    $query->whereNotIn('order_stage_id',[99,4])
        ->where(function($query) {

        $query->where('column_1', 'like', '%XXX%')
            ->orWhere('column_2', 'like', '%XXX%')
            ->orWhere('column_2', 'like', '%XXX%');
    });
});

别忘了,您需要将$request对象传递给每个闭包才能访问它:

->where(function($query) use ($request) {