Laravel 可选 WHERE 子句
Laravel Optional WHERE clause
有没有办法在 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 中实现此目的?
您可以使用'when'方法。在这里阅读它: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();
简单的做法是:
$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();
根据https://laravel.com/docs/5.3/queries#conditional-clauses
->when($request->get('time'), function($query) use ($request) {
$query->whereTime('datetime', '=', $request->get('time'));
})
有没有办法在 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 中实现此目的?
您可以使用'when'方法。在这里阅读它: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();
简单的做法是:
$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();
根据https://laravel.com/docs/5.3/queries#conditional-clauses
->when($request->get('time'), function($query) use ($request) {
$query->whereTime('datetime', '=', $request->get('time'));
})