У меня есть phone_models, phone_problems и сводная таблица phone_model_phone_problem. В сводной таблице есть дополнительный столбец «цена».
PhoneModel:
class PhoneModel extends \Eloquent
{
public function problems()
{
return $this->belongsToMany('RL\Phones\Entities\PhoneProblem')->withPivot('price');
}
}
PhoneProblem:
class PhoneProblem extends \Eloquent
{
public function models()
{
return $this->belongsToMany('PhoneModel')->withPivot('price');
}
}
То, что я пытаюсь сделать, это получить цену конкретного телефона с конкретной проблемой.
Вот как у меня это сейчас, но я чувствую, что в Laravel есть встроенная функция Eloquent, которую я не могу найти, чтобы сделать это намного проще:
$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
но я чувствую, что должен быть намного более легкий и более «Laravel» способ сделать это.
При использовании отношений «многие ко многим» с 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 Прочитайте больше.