【问题标题】:select rows in laravel query在 laravel 查询中选择行
【发布时间】:2018-05-24 18:35:26
【问题描述】:

我有两个表 request 和 status_tracker.request 表有 request_id,approver_id ,status_id 字段,status_tracker 有 request_id,status_before,changed_by,status_after 字段。每个请求都经过审核,状态更改为 17/20。我想获取asset_request表中review(status=17)和approver_id =1866的记录,获取status_tracker表中changed_by'1877'的记录。

我要获取记录 001(status.tracker.changed_by='1866'), 002(approver_id=1866 and status_tracker.status_after='17'), 004((status.tracker.changed_by='1866'))。

request table 
request_id approver_id  status_id requestor
001          11              18    301
002          1866            17    113
003          115             17    159
004          112             19    163
005          1866            1     172
006          1866            20    172  

status_tracker
request_id  status_before   status_after changed_by
  001           null           1            301
  001            1             17          1687
  001            17             8          1724
  001            8             18          1866   
  002           null            2           113
  002            2             17          1687 
  003            null           1           159
  003            1             17          1687
  004            null          1            163
  004            1             17          1687
  004            17             8          1724
  004            8              19         1866     
  005            null           1          172 
  006            null           1          172
  006            1              20         1687    

我试过了

$users = DB::table('asset_status_tracker')
->leftJoin('asset_request', 'asset_status_tracker.request_id', '=','asset_request.request_id')
->where('asset_status_tracker.status_before','!=',null)
->orwhere('asset_status_tracker.changed_by','=',$approver_id)
->orwhere('asset_request.approver_id','=',$approver_id)
->where('asset_status_tracker.status_after','=','17')->get();

现在我得到所有已审核的记录 001,002,003,004,005。我做了什么

【问题讨论】:

  • 你的逻辑对我来说不是很清楚(甚至可能对你来说也不是)。请给出为什么001、002和004应该出现在输出中的确切规则。

标签: mysql laravel laravel-5 laravel-5.3


【解决方案1】:

将两个 Orwhere 放在一个函数中

->orwhere(function($subQ) use ($approver_id) {
    $subQ->where('asset_status_tracker.changed_by','=',$approver_id)
    ->orwhere('asset_request.approver_id','=',$approver_id);
});

【讨论】:

    【解决方案2】:

    使用这个:

    $users = DB::table('asset_status_tracker')
        ->leftJoin('asset_request', 'asset_status_tracker.request_id', '=','asset_request.request_id')
        ->where('asset_status_tracker.status_before','!=',null)
        ->orwhere(function($query) use ($approver_id) {$query->where('asset_status_tracker.changed_by','=',$approver_id)
        ->where('asset_request.approver_id','=',$approver_id);})
        ->where('asset_status_tracker.status_after','=','17')->get();
    

    【讨论】:

    • 我在手机上发布了答案。对不起风格。
    【解决方案3】:

    你可以试试这个:

    $users = DB::table('asset_status_tracker')
    ->leftjoin('asset_request',function($join)
                               {
                                     $join->on('asset_status_tracker.request_id', '=','asset_request.request_id')
                                            ->where('asset_request.approver_id','=',$approver_id)
                                             ->where('asset_status_tracker.status_after','=','17');
                               })
    ->where('asset_status_tracker.status_before','!=',null)
    ->orwhere('asset_status_tracker.changed_by','=',$approver_id)->get();
    

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      • 2017-11-13
      • 2021-04-27
      • 2020-11-20
      相关资源
      最近更新 更多