【问题标题】:Laravel Optional WHERE clauseLaravel 可选的 WHERE 子句
【发布时间】:2018-04-01 18:12:44
【问题描述】:

有没有办法在 Laravel 中实现可选的 WHERE,这是我的查询

$people = \App\people::query()
        -> select ('people.name', 'people.username', 'price', 'service','people.city', 'people.streetaddress', 'people.postalcode', DB::raw("GROUP_CONCAT(DATE_FORMAT(datetime, '%H:%i')) as times"))
        -> groupBy('people') 
        -> leftjoin ('services' , 'people.id', '=', 'services.people_id')
        -> leftjoin ('imagesforpeople' , 'people.id', '=', 'imagesforpeople.people_id')
        -> whereDate ('datetime', '=', $request->get('date'))
        -> whereTime ('datetime', '=', $request->get('time'))
        -> get();

在这里,我希望这条线是可选的

-> whereTime ('datetime', '=', $request->get('time'))

所以,如果搜索不包含时间,它将完全忽略这行查询。

需要whereDate,但不需要whereTime。如果获取到时间请求,则查询时间,如果没有获取到时间请求,则忽略 whereTime 查询,只显示 whereDate 的结果。

如何在 Laravel 中实现这一点?

【问题讨论】:

标签: php mysql laravel laravel-5.3


【解决方案1】:

您可以使用“何时”方法。在这里阅读它:https://laravel.com/docs/5.5/queries#conditional-clauses

$people = \App\people::query()
            -> select ('people.name', 'people.username', 'price', 'service','people.city', 'people.streetaddress', 'people.postalcode', DB::raw("GROUP_CONCAT(DATE_FORMAT(datetime, '%H:%i')) as times"))
            -> groupBy('people') 
            -> leftjoin ('services' , 'people.id', '=', 'services.people_id')
            -> leftjoin ('imagesforpeople' , 'people.id', '=', 'imagesforpeople.people_id')
            -> whereDate ('datetime', '=', $request->get('date'))
            -> when($request->get('time'), function($query) use($request) { 
                 $query->where('datetime', '=', $request->get('time')
             })-> get();

【讨论】:

  • 这可能是正确的做法,但你真的应该提供一个例子
【解决方案2】:

简单的做法是:

$peopleQuery = \App\people::query()
    ->select('people.name', 'people.username', 'price', 'service','people.city', 'people.streetaddress', 'people.postalcode', DB::raw("GROUP_CONCAT(DATE_FORMAT(datetime, '%H:%i')) as times"))
    ->groupBy('people') 
    ->leftjoin('services', 'people.id', '=', 'services.people_id')
    ->leftjoin('imagesforpeople', 'people.id', '=', 'imagesforpeople.people_id')
    ->whereDate('datetime', '=', $request->get('date'));

if ($request->has("time")) {
    $peopleQuery->whereTime('datetime', '=', $request->get('time'));
}

$people = $peopleQuery->get();

【讨论】:

    【解决方案3】:

    根据https://laravel.com/docs/5.3/queries#conditional-clauses

    ->when($request->get('time'), function($query) use ($request) {
         $query->whereTime('datetime', '=', $request->get('time')); 
    })
    

    【讨论】:

      猜你喜欢
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 2012-05-05
      相关资源
      最近更新 更多