получение значения столбца дополнительной сводной таблицы laravel

У меня есть 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» способ сделать это.

43

Решение

При использовании отношений «многие ко многим» с Eloquent полученная модель автоматически получает pivot атрибут назначен. С помощью этого атрибута вы можете получить доступ к столбцам сводной таблицы.
Хотя по умолчанию в объекте сводки присутствуют только ключи. Чтобы ваши столбцы тоже были там, вам нужно указать их при определении отношения:

return $this->belongsToMany('Role')->withPivot('foo', 'bar');

Официальные документы

Если вам нужна дополнительная помощь по настройке отношений с Eloquent, дайте мне знать.

редактировать

Для запроса цены сделайте это

$model->problems()->where('phone_problem', $problem->id)->first()->pivot->price
93

Другие решения

к получить данные из сводной таблицы:

$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 Прочитайте больше.

10

По вопросам рекламы [email protected]