gpt4 book ai didi

mysql - Laravel 5 在 BETWEEN 中使用 OR 条件

转载 作者:可可西里 更新时间:2023-11-01 07:13:17 34 4
gpt4 key购买 nike

嗨,任何人都可以帮助我在 laravel Eloquent 中构建以下查询,我真的很困惑将 OR 条件与 between

一起使用
SELECT * FROM tbl WHERE
existing_start BETWEEN $newSTart AND $newEnd OR
$newStart BETWEEN existing_start AND existing_end

我试过用like

whereBetween('existing_start',[$newSTart,$newEnd])

但不知道如何使用 OR

最佳答案

查询生成器中有一个orWhereBetween 方法可用,但它没有记录在Query Builder Documentation 中。 .但是,您可以在 Laravel API Documentation 中找到它.


下面的解释假设变量具有以下值:

$newStart = '1';
$newEnd = '10';

不幸的是,对第二个条件使用 orWhereBetween 不适用于您的情况,因为 whereBetweenorWhereBetween 都会检查列值介于两个输入值之间。从第一个条件来看这很好,因为它检查 existing_start 列值是否在 $newStart$newEnd 之间。所以这很好:

->whereBetween('existing_start', [$newStart, $newEnd])

因为它将被编译为:

WHERE `existing_start` BETWEEN '1' AND '10'

然而,您的第二个条件想要检查来自 $newStart 的输入值是否介于两个列值 existing_startexisting_end 之间,并且有没有执行此操作的查询生成器方法。所以这是行不通的:

->orWhereBetween($newStart, ['existing_start', 'existing_end'])

因为它会被编译成:

OR `1` BETWEEN 'existing_start' AND 'existing_end'

请注意 1 周围的反引号 `,因为 MySQL 将尝试查找名为 1 的列并抛出错误。


所以这里最好的选择是使用 orWhereRaw 和这样的绑定(bind):

DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();

? 将替换为 $newStart 的值,该值将被正确引用和转义以避免 SQL 注入(inject)。


或者当然总是有两个分组条件来检查边界的选项,这相当于您的 BETWEEN 条件:

DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhere(function ($query) use ($newStart) {
$query->where('existing_start', '<=', $newStart);
$query->where('existing_end', '>=', $newStart);
})->get();

将编译为:

SELECT * FROM `tbl`
WHERE
`existing_start` BETWEEN '1' AND '10' OR
(`existing_start` <= '1' AND `existing_end` >= '1')

关于mysql - Laravel 5 在 BETWEEN 中使用 OR 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35925313/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com