【问题标题】:Combining AND/OR eloquent query in Laravel在 Laravel 中结合 AND/OR 雄辩的查询
【发布时间】:2013-03-27 06:46:57
【问题描述】:

如何使用 Eloquent 编写以下或类似类型的查询?

SELECT * FROM a_table WHERE (a LIKE %keyword% OR b LIKE %keyword%) AND c = 1 AND d = 5

我无法通过链接 where 和 or_where 函数以我想要的方式组合 AND/OR。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    您可以嵌套 where 子句:http://laravel.com/docs/database/fluent#nested-where

    Model::where(function($query)
    {
        $query->where('a', 'like', 'keyword');
        $query->or_where('b', 'like', 'keyword');
    })
    ->where('c', '=', '1');
    

    这应该产生:SELECT * FROM models WHERE (a LIKE %keyword% OR b LIKE %keyword%) AND c = 1

    【讨论】:

    • 如果关键字本身是一个字符串,则上述语句有效。但是如果关键字是变量,我该如何使用上面的内容呢?
    • @SUB0DH 您可以使用 use 将变量注入到闭包范围内。 function($query) use ($variable)
    • or_where 应该是orWhere 6+
    【解决方案2】:

    对于示例的更准确答案:

    $val = '%keyword%';
    
    A_Table_Model::where(function($query) use ($val)
    {
        $query->where('a', 'like', $val);
        $query->or_where('b', 'like', $val);
    })
    ->where('c', '=', 1)
    ->where('d', '=', 5)
    ->get();
    

    注意:这是 Laravel 3 的语法,对于 Laravel 4 使用 camelCase orWhere()

    【讨论】:

    • 在 Laravel 4 中(至少)你需要在括号中使用$val,如示例A_Table_Model::where(function($query) use ($val)
    【解决方案3】:

    在 Laravel 5.1+ 中,这也可以完成工作并且看起来更干净:

    Model::where(function($query) {
        $query->where('a', 'like', 'keyword');
        $query->or_where('b', 'like', 'keyword');
    })->where('c', '=', '1')->get();
    

    【讨论】:

    • 致对此投了反对票的人-您能解释一下这个解决方案有什么问题吗?
    • 投反对票的不是我,但无论如何:你的答案没有涵盖问题的“AND c = 1 AND d = 5”部分,所以你的答案是错误的。跨度>
    【解决方案4】:

    您可以在第一个where() 中使用DB::raw() 来放入like/or 语句。

    【讨论】:

    • 使用内置的 Eloquent 方法比这要好得多。
    猜你喜欢
    • 2016-07-05
    • 2014-08-23
    • 1970-01-01
    • 2021-07-04
    • 2018-02-13
    • 2017-01-30
    • 2018-01-26
    • 2021-07-23
    相关资源
    最近更新 更多