Отношение Laravel между 5 таблицами

#php #laravel #orm

#php #laravel #orm

Вопрос:

пожалуйста, каков правильный способ получения данных из таблицы MN, где одному продукту присвоено несколько комбинаций Mark / Model / Year.

Например, продукт с идентификатором 1 имеет следующее значение в таблице mmis:

 id   | product_id | mark_id | model_id | year_id
178         1          1           1        2
177         1          2           1        3
176         1          3           1        1
  

другие таблицы: оценки, модели, годы.

Все в порядке, получая все запрошенные данные просто:

 $items = ProductMmi::where('product_id', $id)
 ->with(['mark', 'model', 'year'])
 ->get();
  

Проблема в том, что таким образом я не могу сортировать результат на основе mark.name ASC, model.name ASC, year.name ASC.

Спасибо за любой совет.

обновление: забыл добавить мою вторую попытку — заказ все еще в затруднении…

 $items = ProductMmi::select([
    'product_mmis.*',
    'marks.*',
    'mark_models.*',
    'mark_model_years.*'
  ])
  ->join('marks', 'product_mmis.mark_id', '=', 'marks.id')
  ->join('mark_models', 'product_mmis.model_id', '=', 'mark_models.id')
  ->join('mark_model_years', 'product_mmis.year_id', '=', 'mark_model_years.id')
  ->where('product_mmis.product_id', $id)
  ->orderBy('mark', 'asc')
  ->orderBy('model', 'asc')
  ->orderBy('year', 'asc')
  ->get();
  

Ответ №1:

вы можете использовать этот способ

 $items = ProductMmi::where('product_id', $id)->with(['mark'=>function($query){
            $query->orderBy('your_column_name','ASC');
        }])->with(['model', 'year'])
            ->get();
  

или одна вещь, если вы не хотите редактировать свой запрос, тогда в модели вы можете сделать также следующее

 public function mark()
    {
        return $this->hasMany(Mark::class)->orderBy('mark','asc');
    }
  

Ответ №2:

Я думаю, что решение состояло в том, чтобы добавить методы OrderBy между конкретными объединениями. Например. следующий случай работает полностью правильно:

     $items = ProductMmi::select([
        'product_mmis.*',
        'marks.*',
        'mark_models.*',
        'mark_model_years.*'
      ])
      ->join('marks', 'product_mmis.mark_id', '=', 'marks.id')
      ->orderBy('mark', 'asc')
      ->join('mark_models', 'product_mmis.model_id', '=', 'mark_models.id')
      ->orderBy('model', 'asc')
      ->join('mark_model_years', 'product_mmis.year_id', '=', 'mark_model_years.id')
      ->where('product_mmis.product_id', $id)
      ->orderBy('year', 'desc')
      ->get();
  

Есть ли лучший способ сделать это более эффективным способом? Спасибо.