雄辩的复杂查询

Posted

技术标签:

【中文标题】雄辩的复杂查询【英文标题】:Eloquent complex query 【发布时间】:2017-02-17 15:49:10 【问题描述】:

我需要sql查询,但我需要使用Eloquent:

"SELECT * FROM Pass WHERE serial_number=$registered_serial_numbers AND (updated_at IS NULL OR updated_at >= $passesUpdatedSince)"

我尝试但有错误:

$registered_passes = Pass::where('serial_number', $registered_serial_numbers)->where("updated_at IS NULL OR updated_at >= $passesUpdatedSince")->get();

Eloquent 应该怎么做?

【问题讨论】:

【参考方案1】:

两种方法:

1) 使用 whereRaw()

$registered_passes = Pass::whereIn('serial_number', $registered_serial_numbers)->whereRaw('updated_at IS NULL OR updated_at >= ?', $passesUpdatedSince)->get();

2) 使用闭包做 AND (OR)

$registered_passes = Pass::whereIn('serial_number', $registered_serial_numbers)->where(function($query)
$query->whereNull('updated_at')->orWhere('updated_at', '>=', $passesUpdatedSince);)->get();

https://laravel.com/docs/5.3/queries#where-clauses

查看“参数分组”部分

【讨论】:

【参考方案2】:

查询应该是这样的:

$registered_passes = Pass::where("updated_at", $passesUpdatedSince)->whereIn('serial_number',$registered_serial_numbers)->get();

您对where in 子句使用whereIn 方法并确保$registered_serial_numbers 是一个值数组。

我的错,误读了。如果您对序列号没问题,只需像这样发送whereRaw

$registered_passes = Pass::where('serial_number',$registered_serial_numbers)->whereRaw('updated_at IS NULL OR updated_at >= ?', $passesUpdatedSince)->get();

【讨论】:

序列号没有问题,“updated_at IS NULL OR updated_at >= $passesUpdatedSince”有问题 是的,当然,只是在其中粘贴了相同的内容。已编辑。

以上是关于雄辩的复杂查询的主要内容,如果未能解决你的问题,请参考以下文章

如何将复杂的 sql 查询转换为 laravel Eloquent

Laravel 复杂的雄辩关系

雄辩的查询转换为浮动

Laravel 雄辩的极限查询

雄辩地执行子查询?

带有雄辩查询的 Laravel 分页