【问题标题】: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 应该怎么做?

【问题讨论】:

    标签: sql laravel orm 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”有问题
      • 是的,当然,只是在其中粘贴了相同的内容。已编辑。
      猜你喜欢
      • 2014-01-16
      • 2019-12-19
      • 2023-02-23
      • 2020-03-19
      • 1970-01-01
      • 2015-07-07
      • 2018-01-26
      • 2014-04-12
      • 2021-07-23
      相关资源
      最近更新 更多