У меня есть 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».
При использовании отношений Many to Many с 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;
К тому же.
Чтобы обновить данные в стержне, вы можете перейти NEW WAY :
$model->problems()->sync([$problemId => [ 'price' => $newPrice] ], false);
Где второй параметр, установленный в false, означает, что вы не отсоединяете все другие связанные модели.
Или, по- старому
$model->problems()->updateExistingPivot($problemId, ['price' => $newPrice]);
И напомню:
Чтобы удалить :
$model->problems()->detach($problemId);
Чтобы создать новое:
$model->problems()->attach($problemId, ['price' => 22]);
Он был протестирован и доказан, работая в Laravel 5.1 .