получение значения дополнительного столбца сводной таблицы 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, но я чувствую, что для этого должен быть гораздо более простой и "ларавельный" способ.

Author: Rodrigo, 2014-10-26

2 answers

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

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

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

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

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

Чтобы запросить цену, сделайте это

$model->problems()->where('phone_problem', $problem->id)->first()->pivot->price
 83
Author: lukasgeiter, 2014-10-25 20:20:29

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

$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 Подробнее.

 9
Author: Yevgeniy Afanasyev, 2018-03-13 21:20:42