Laravel 查询或运算符优先级

Posted

技术标签:

【中文标题】Laravel 查询或运算符优先级【英文标题】:Laravel query Or operator priority 【发布时间】:2019-11-12 02:47:51 【问题描述】:

我正在使用 laravel 4 查询。我想通过 OR 条件获取数据。 Laravel 4 有什么优先级规则吗?

我的查询是:

SELECT * 
FROM order_items 
WHERE (status = 'Y' OR (status = 'N' AND amount > 100)) 
AND product_id = '15' 
LIMIT 1;

我有 2 个订单项目,但我希望结果中的第一个项目将获得优先状态 = 'Y',如果它不存在,那么它满足 OR 的第二个条件。

这是我的 laravel 代码:

$sql_select = "SELECT * 
               FROM order_items 
                WHERE (status = 'Y' OR (status = 'N' AND amount > 100)) 
                AND product_id = '15' 
                LIMIT 1";
$data = DB::select($sql_select);
echo "<pre>";
print_r($data);
die;

对于简单的 mysql 查询,它可以工作,但在 laravel 中它没有给出结果。

【问题讨论】:

你能分享你的 laravel 代码吗? 另外,没有ORDER BYLIMIT 1 也没有意义,因为SQL 表/结果集是由SQL 标准定义的无序 How to Create Multiple Where Clause Query Using Laravel Eloquent?的可能重复 考虑到您在不使用查询构建器的情况下传递完全相同的查询,它应该返回相同的结果。 接缝不见了-&gt;get() ? 【参考方案1】:

也许你应该试试这个方法

DB::table('order_items')
        ->where('status', 'Y')
        ->orWhere(function($query)
        
            $query->where('status', 'N')
                  ->where('amount', '>', '100');
        )
    ->where('product_id', 15)
        ->first();

【讨论】:

不确定 laraval 是如何实现 first() 的,所以我不确定这是否比使用 LIMIT 1 没有 ORDER BY 子句更好。但我认为这是像肮脏/懒惰的第一个数组元素选择一样实现的出于某种原因在数据库结果.. 方法 first() 正在检索第一个匹配查询约束的模型【参考方案2】:

很好的解决方案 andreeab。

在我的例子中,SQL 查询是:

选择 ... WHERE c1 = 'xyz' AND (c2 = 100 OR c2 = 200);

我用 Eloquent 写的:

 DB:table('tablename')
    ->where('c1', '=', 'xyz')
    ->where(function($query)
    
       $query->where('c2', '=', 100)
             ->orWhere('c2', '=', 200); 
    )
    ->get();

【讨论】:

以上是关于Laravel 查询或运算符优先级的主要内容,如果未能解决你的问题,请参考以下文章

delphi 运算符优先级

在 SELECT 查询中使用集运算符

优先级:逻辑或与三元运算符

运算符优先级 以及 && (逻辑与) 和||(逻辑或)的优先级:

“或”的运算符优先级和赋值

C语言中30多个运算符的优先级顺序