#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();
Есть ли лучший способ сделать это более эффективным способом? Спасибо.