Мне нужно отсортировать данные mg_properties по количеству заказов (в порядке убывания). Я создал код построителя запросов, как это. он работает, но выглядит грязно. (этот проект создан с использованием Laravel 5.4).
в этой таблице больше столбцов, но я удалил эти столбцы, не используя запрос)
table: mg_properties
+----+-------------+----------+------------+------------+
| id | property_id | sub_data | created_at | updated_at |
+----+-------------+----------+------------+------------+
table: bookings:
+----+---------+-------------+--------+------------+------------+
| id | room_id | customer_id | status | created_at | updated_at |
+----+---------+-------------+--------+------------+------------+
table: rooms:
+----+-------------+-----------+--------+------------+------------+
| id | property_id | room_type | status | created_at | updated_at |
+----+-------------+-----------+--------+------------+------------+
table: properties
+----+----------------------+------+------------+------------+
| id | property_category_id | name | created_at | updated_at |
+----+----------------------+------+------------+------------+
рабочий код (но не полный красноречивый)
public function GetSortedProperties($customer_id = null){
try {
$raw_query = Booking::select('mg_properties.property_id as id')
->where(function ($q) use($customer_id) {
if(!$customer_id == null){
$q->whereRaw('bookings.customer_id = '.DB::connection()->getPdo()->quote($customer_id));
}else{
$past_date = Carbon::now()->subWeek()->toDateTimeString();
$q->whereRaw("bookings.created_at >= '$past_date'");
}
})
->whereRaw('bookings.status = "Approved"')
->selectRaw('COUNT("mg_properties.property_id") as booking_count')
->join('rooms','rooms.id','=','bookings.room_id')
->join('mg_properties','mg_properties.property_id','=','rooms.property_id')
->groupBy('mg_properties.property_id')
->toSql();
$sorted_ids = DB::table('mg_properties')
->select('properties.*','joindata.booking_count')
->join('properties','properties.id','=','mg_properties.property_id')
->leftjoin(DB::raw("($raw_query) as joindata"), function($join)
{
$join->on('mg_properties.property_id', '=', 'joindata.id');
})
->where('mg_properties.status', 'Active')
->orderBy('booking_count','DESC')
->get();
return $sorted_ids;
} catch (\Exception $e) {
Log::error('Error in property sorting.. '.$e->getMessage().' '. $e->getFile().' '. $e->getLine());
return null;
}
}