получение значения дополнительного столбца сводной таблицы laravel
У меня есть сводная таблица phone_models, phone_problems и phone_model_phone_problem. В сводной таблице есть дополнительный столбец "цена".
Фонемодель:
class PhoneModel extends \Eloquent
{
public function problems()
{
return $this->belongsToMany('RL\Phones\Entities\PhoneProblem')->withPivot('price');
}
}
Телефонная проблема:
class PhoneProblem extends \Eloquent
{
public function models()
{
return $this->belongsToMany('PhoneModel')->withPivot('price');
}
}
Что я пытаюсь сделать, так это узнать цену конкретного телефона с конкретной проблемой.
Вот как у меня это сейчас, но я чувствую, что у Laravel есть встроенная функция красноречия, которую я не могу найти, чтобы сделать это намного проще:
$model = $this->phoneService->getModelFromSlug($model_slug);
$problem = $this->phoneService->getProblemFromSlug($problem_slug);
Все, что для этого нужно, - это выбрать конкретный модель и проблема из их слизняка.
Тогда то, что я делаю с этими учетными данными, я получаю такую цену:
$row = DB::table('phone_model_phone_problem')
->where('phone_model_id', '=', $model->id)
->where('phone_problem', '=', $problem->id)
->first();
Так что теперь я могу получить такую цену$row->price
, но я чувствую, что для этого должен быть гораздо более простой и "ларавельный" способ.
2 answers
При использовании отношений "Многие ко многим" с Eloquent результирующей модели автоматически присваивается атрибут pivot
. С помощью этого атрибута вы можете получить доступ к столбцам сводной таблицы.
Хотя по умолчанию в сводном объекте есть только ключи. Чтобы ваши столбцы тоже были там, вам нужно указать их при определении взаимосвязи:
return $this->belongsToMany('Role')->withPivot('foo', 'bar');
Если вам нужна дополнительная помощь в настройке отношений с Eloquent, позвольте мне знать.
Редактировать
Чтобы запросить цену, сделайте это
$model->problems()->where('phone_problem', $problem->id)->first()->pivot->price
К получить данные из сводной таблицы:
$price = $model->problems()->findOrFail($problem->id, ['phone_problem'])->pivot->price;
Или если у вас много записей с разной ценой:
$price = $model->problems()->where('phone_problem', $problem->id)->firstOrFail()->pivot->price;
В дополнение.
Для обновления данных в сводной таблице вы можете перейти ПО-НОВОМУ:
$model->problems()->sync([$problemId => [ 'price' => $newPrice] ], false);
Где 2-й параметр имеет значение false, что означает, что вы не отсоединяете все другие связанные модели.
Или идите старым путем
$model->problems()->updateExistingPivot($problemId, ['price' => $newPrice]);
И напоминаю вам:
До удалить:
$model->problems()->detach($problemId);
К создать новое:
$model->problems()->attach($problemId, ['price' => 22]);
Он был протестирован и доказал свою работу в Laravel 5.1 Подробнее.