首页 > 解决方案 > 在 Eloquent 中构建复杂的 WHERE 查询

问题描述

我已经有一段时间遇到麻烦了,我无法弄清楚(即使我知道这可能很简单)。我正在 Laravel 中迈出第一步,我想使用 Eloquent 构建这样的查询。

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

或者

// 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.'%');
});

标签: laraveleloquent

解决方案


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

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

您需要使用where()方法来获取 SQLAND运算符,然后使用闭包来嵌套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) {


推荐阅读