雄辩的复杂查询
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”有问题 是的,当然,只是在其中粘贴了相同的内容。已编辑。以上是关于雄辩的复杂查询的主要内容,如果未能解决你的问题,请参考以下文章