Как преобразовать код построителя запросов в laravel eloquent (быстрее получить большой объем данных)? - PullRequest
1 голос
/ 23 февраля 2020

Мне нужно отсортировать данные 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;

       }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...