【问题标题】:Can i use if condition on laravel database query?我可以在 laravel 数据库查询中使用 if 条件吗?
【发布时间】:2019-10-29 23:35:46
【问题描述】:

我可以在查询中使用if 条件吗,我想在$request->review = 7 时使用过滤器,它将显示 7 天数据,否则条件默认为 30 天数据。

$reviews = Review::orderBy('created_at', 'DESC')
    ->orWhere('created_at', '>=', if($request->review == "7"){ $month = 7 })
    ->where('listing_id', $id)
    ->where('user_id', Auth::User()->id)
    ->paginate(6, ['*'], 'review');

【问题讨论】:

  • created_at >= 7 似乎不正确。 @MarcinNabiałek 对 created_at 的看法是否正确,您的意思是“过去 7 天”和“过去 30 天”?
  • 我当前的查询是这个 $reviews = Review::orderBy('created_at', 'DESC')->orWhere('created_at','>=',$month)->where(' Listing_id', $id)->where('user_id', Auth::User()->id)->paginate(6, ['*'], 'review');这是显示过去 30 天的数据,现在我想显示 7 天的数据,当某些人点击一周时

标签: mysql laravel laravel-5 eloquent laravel-query-builder


【解决方案1】:

你可以这样使用:

$reviews = Review::orderBy('created_at', 'DESC')
    ->orWhere('created_at','>=',now()->subDays($request->review == 7 ? 7 : 30)
    ->where('listing_id', $id)
    ->where('user_id', Auth::user()->id)
    ->paginate(6, ['*'], 'review');

但请记住,您可能仍然会得到错误的结果。

您应该确保在正确的位置将括号添加到查询中,否则您可能会得到其他用户的结果,所以实际上您很可能想要使用这样的东西:

$reviews = Review::orderBy('created_at', 'DESC')
    ->where(function($q) use ($request) {
      $q->where('listing_id', $id)
         ->orWhere('created_at','>=',now()->subDays($request->review == 7 ? 7 : 30)
    })
    ->where('user_id', Auth::user()->id)
    ->paginate(6, ['*'], 'review');

但您还没有解释您想从数据库中获得什么确切结果,所以这只是一个提示。

【讨论】:

  • 不工作我把括号放在正确的地方 $reviews = Review::orderBy('created_at', 'DESC')->orWhere('created_at','>=',now()- >subDays($request->review == 7 ? 7: 30))->where('listing_id', $id)->where('user_id', Auth::User()->id)->paginate( 6, ['*'], '审核');
  • @SandipJha 抱歉,“不工作”什么也没说。如果您没有任何结果或查询完全错误,那么您将不会得到预期的结果
【解决方案2】:

您可以通过光标拆分 Eloquent Builder。

$cursor = Review::orderByDesc('created_at');

if ($request->review == "7") {
    $cursor->orWhere('created_at','>=', 7));
}
$reviews = $cursor->where('listing_id', $id)
    ->where('user_id', Auth::user()->id)
    ->paginate(6, ['*'], 'review');

【讨论】:

  • 当我使用这个零结果时
【解决方案3】:
$reviews = Review::where('listing_id', $id)
                 ->where('user_id', Auth::user()->id);

if($request->review == 7){
    $reviews->Where('created_at','>=',now()->subDays($request->review));
}

if($request->review != 7){
    $reviews->Where('created_at','>=',now()->subDays(30));
}

$reviews->orderBy('created_at', 'DESC')
        ->paginate(6, ['*'], 'review');

了解以上内容后,您可以继续使用三元运算符简化上述内容,如下所示。

$reviews = Review::where('listing_id', $id)
    ->where('user_id', Auth::user()->id);
    ->Where('created_at','>=',now()->subDays(($request->review == 7)? 7 : 30));
    ->orderBy('created_at', 'DESC')
    ->paginate(6, ['*'], 'review');

【讨论】:

    【解决方案4】:

    $reviews = Review::orderBy('created_at', 'DESC');

    if ($request->review == "7") {

    $reviews->orWhere('created_at','>=', 7));
    

    } $reviews = $reviews->where('listing_id', $id)

    ->where('user_id', Auth::User()->id)
    
    ->paginate(6, ['*'], 'review');
    

    【讨论】:

    • $reviews = Review::orderBy('created_at', 'DESC') if ($request->review == "7") { $reviews->orWhere('created_at','> =', 7)); } $reviews = $reviews->where('listing_id', $id) ->where('user_id', Auth::User()->id) ->paginate(6, ['*'], 'review' );
    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多