Отношение «многие ко многим» с дополнительным внешним ключом - PullRequest
1 голос
/ 14 января 2020

Я создаю простой API поваренной книги, используя Lumen .

На этом этапе настройки таковы:

  • отношение многие ко многим :
    • recipe имеет много ingredient s
    • ingredient имеет множество recipe s
  • a отношение один ко многим :
    • recipe имеет много step s

Отношение многие-ко-многим реализовано с использованием ассоциативной таблицы ingredient_recipe:

db-1

Это работает, как и ожидалось, и позволяет мне получить доступ, например, $someRecipe->ingredients, чтобы связать все ингредиенты с указанным рецептом c.

Однако - и это та часть, в которой я не совсем уверен - учитывая специфику отношения c recipe-ingredient, ingredient также имеет спецификацию c measure (например, «миллилитр») ) и количество.

В настоящее время я решаю эту проблему, просто добавляя measure_id к каждому recipe-ingredient отношению в ассоциативной таблице:

db-2

Я выполнил sh это с помощью следующего кода:

$recipe->ingredients()->attach($ingredient_model, ['amount' => GIVEN_AMOUNT, 'measure_id' => GIVEN_MEASURE_ID);

Это работает, но делает запрос, чтобы получить количество и меру для каждого ингредиента в данном рецепте, немного более сложным.

Мой вопрос: есть ли другой, может быть, более Eloquent способ достижения sh этого, которого я не вижу? Или есть другие рекомендации по проектированию баз данных для таких случаев, о которых я не знаю?

Ответы [ 2 ]

0 голосов
/ 15 января 2020
// Recipe Model
public function recipes()
    {
        return $this->belongsToMany('App\Recipe')->withTimestamps();
    }
// Ingredient Model
 public function ingredients()
    {
        return $this->belongsToMany('App\Ingredient ')->withTimestamps();
    }

// Controller 
public function index()
    {
        $recipes= Recipe ::latest()->get();
        return view('admin.recipes.index',compact('recipes'));
    }

// Blade file

 @foreach($recipesas $key=>$recipe)
<tr>
<td>{{$recipe->ingredients->name}}</td>
</tr>
@endforeach
0 голосов
/ 14 января 2020

У меня была та же проблема, моя ситуация такова: есть заказы и продукты для каждого, многие ко многим, каждый продукт имеет свою собственную единицу измерения и количество для каждого заказа, что-то вроде этого: предварительная модель база данных

Я не знаю, правильно ли это, но я просто добавил метод к модели продукта

public function measurement()
{
    $measurement = Measurement::find($this->pivot->measurement_id);

    return $measurement;
}

, и теперь я могу использовать это

@foreach ($order->products as $product)
    {{ $product->measurement()->name }}
@endforeach

Я думаю, вам просто нужно добавить в модель ингредиента

public function measure()
{
    $measure = Measure::find($this->pivot->measure_id);

    return $measure;
}
...