Laravel 5.7 правильный способ получения результатов по отношению ко многим - PullRequest
0 голосов
/ 21 декабря 2018

Я изучаю основы Laravel и у меня довольно простой вопрос:

У меня есть три стола:

Таблица блюд:

foods
--------------
id | name

Таблица ингредиентов:

ingredients
---------------
id, | name

Сводная таблица:

food_ingredient
---------------
food_id | ingredient_id

В моделях, которые я использую, метод "ownToMany":

Модель еды:

public function ingredients(){
    return $this->belongsToMany('App\Models\Ingredient');
}

Модель ингредиента:

public function foods(){
    return $this->belongsToMany('App\Models\Food');
}

FoodsController (index):

    $foods = Food::all();

    foreach($foods as $food){
        $food->ingredients = Ingredient::join('food_ingredient','food_ingredient.id','=','ingredients.id')
                                       ->where('food_ingredient.food_id',$food->id)->get();
    }

Я хочу получить информацию об ингредиентах (только название до сих пор) каждого продукта и этот запрос (тот, которыйнаходится в цикле foreach), но я не уверен, правильно ли я это делаю.Я не использую отношения ownToMany, поэтому ... должно быть, что-то не так в моем понимании.

Как я могу получить названия ингредиентов?

Пока не узнаем, что только эти имена в порядке, но я добавлю третью таблицу "аллергенов", и скоро она станет сводной таблицей "аллерген_агрегент".Затем я должен получить все продукты, их ингредиенты, а также аллергены каждого ингредиента.Итак, я хочу сделать это хорошо с этого момента.

Заранее спасибо.

1 Ответ

0 голосов
/ 21 декабря 2018

Модель еды

  class Food extends Model
{
    protected $table        = 'foods';
    protected $primaryKey   = 'food_id';
    public    $incrementing = TRUE;
    public    $timestamps   = FALSE;
    protected $fillable     = [
        'food_name'
    ];
    public
    function ingredients()
    {
        return $this->belongsToMany(Ingredient::class, 'food_ingredients', 'food_id', 'ingredient_id');
    }
}

Модель ингредиента

class Ingredient extends Model
{
    protected $table        = 'ingredients';
    protected $primaryKey   = 'ingredient_id';
    public    $incrementing = TRUE;
    public    $timestamps   = FALSE;
    protected $fillable     = [
        'ingredient_name'
    ];


    public
    function foods()
    {
        return $this->belongsToMany(Food::class, 'food_ingredients', 'ingredient_id', 'food_id');
    }
}

, и вы можете назвать ее так:

$foods = Food::all();
   foreach( $foods as $food )
   {
       foreach( $food->ingredients as $ingredient )
       {
         echo $ingredient->ingredient_name . " <br>";
       }
   }

food_ingredients - это сводная таблицаимя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...