laravel 5.7在多对多关系上获得结果的正确方法

时间:2018-12-21 17:36:04

标签: laravel many-to-many pivot-table

我正在学习laravel框架,我有一个非常简单的问题:

我有三个表:

食物表:

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

成分表:

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

数据透视表:

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

在模型中,我具有“ belongsToMany”方法:

食物模型:

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

成分模型:

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

FoodsController(索引):

    $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循环中)可以完成,但是我不确定是否要在正确的方法。我没有使用belongsToMany关系,所以...据我所知一定有问题。

如何获取成分名称?

直到知道这些名称都可以,但是我将添加第三个表“ allergens”,并将其作为数据透视表“ allergen_ingredient”。然后,我将必须获取每种食物,其成分以及每种成分的过敏原。所以,我想从现在开始做。

谢谢。

1 个答案:

答案 0 :(得分:0)

食物模型

  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是数据透视表名称