有没有办法让这些查询变短或变简?或者可能在1个查询中得到结果而不是3个。 任何建议赞赏
$room_single = \DB::table('book_room')
->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID')
->where('tourdateID', '=', $id)
->where('roomtype','=',1)
->where('book_room.status','=',1)
->count();
$room_double = \DB::table('book_room')
->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID')
->where('tourdateID', '=', $id)
->where('roomtype','=',2)
->where('book_room.status','=',1)
->count();
$room_triple = \DB::table('book_room')
->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID')
->where('tourdateID', '=', $id)
->where('roomtype','=',3)
->where('book_room.status','=',1)
->count();
$total= $room_single+($room_double*2)+($room_triple*3) ;
答案 0 :(得分:1)
在这种情况下,由于roomtype
列与您计算总数的方式直接相关,因此您可以使用sum
代替count
:
$total = \DB::table('book_room')
->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID')
->where('tourdateID', '=', $id)
->where('book_room.status', '=', 1)
->sum('roomtype');
<强>更新强>
如果您仍需要每个roomtype
的计数,那么您可以执行以下操作:
$query = \DB::table('book_room')
->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID')
->where('tourdateID', '=', $id)
->where('book_room.status', '=', 1);
$room_single = $query->newQuery()->where('roomtype', 1)->count();
$room_double = $query->newQuery()->where('roomtype', 2)->count();
$room_triple = $query->newQuery()->where('roomtype', 3)->count();
$total = $room_single + ($room_double * 2) + ($room_triple * 3);
使用newQuery
意味着您可以重复使用约束而无需添加原始内容。
或者,如果您不想进行多次查询,并且希望php处理计数
$rooms = \DB::table('book_room')
->select('roomtype')
->selectRaw('count(*) as room_count')
->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID')
->where('tourdateID', '=', $id)
->where('book_room.status', '=', 1)
->whereBetween('roomtype', [1, 3])//This is only needed if you have other room types
->groupBy('roomtype')
->orderBy('roomtype')
->get('roomtype');
list($room_single, $room_double, $room_triple) = $rooms->pluck('room_count')->toArray();
$total = $rooms->sum(function ($item) {
return $item->room_count * $item->roomtype;
});
希望这有帮助!
答案 1 :(得分:0)
我没有足够的贡献,这就是我发布答案的原因。 试试
GROUP BY roomtype
然后您无需更改房型。
答案 2 :(得分:0)
你可以用更简单的方式来做。
一个是,
$query = \DB::table('book_room')
->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID')
->where('tourdateID', '=', $id)
->where('book_room.status','=',1);
$room_single = $query->where('roomtype','=',1)->count();
$room_double = $query->where('roomtype','=',2)->count();
$room_triple = $query->where('roomtype','=',3)->count();
然后根据需要添加这些。这只是减少你的代码行。
另一个更好的方法是跟随。
$all_type = \DB::table('book_room')
->leftJoin('book_tour', 'book_room.bookingID', '=', 'book_tour.bookingID')
->where('tourdateID', '=', $id)
->where('book_room.status','=',1)
->select('roomtype',\DB::raw('COUNT(bookingID) as count'))
->groupBy('roomtype')
->get();
使用此查询,您将获得每种房型的三个计数。 希望你明白。