无法从Laravel中的数据透视表获取所有数据

时间:2019-04-17 13:21:40

标签: php laravel

我正在尝试使用数据透视表,但无法获取所需的所有数据。 我有三个数据库表:

1.ingredients
2.recipes
3.ingredients_in_recipe (Pivot table)

1。成分表包含两种成分:

--------------------
-- id | name      --
-- 1  | Potatoes  --
-- 2  | Onions    --
--------------------

2。配方表包含三个配方:

---------------------------------------------
-- id | name                               --
-- 1  | Recipe with potatoes               --
-- 2  | Recipe with onions                 --
-- 3  | Recipe with potatoes and onions    --
---------------

3。Ingredients_in_recipe表:

---------------------------------------
-- id | recipe_id| ingredient_id     --
-- 1  |    1     |      1            --
-- 2  |    2     |      2            --
-- 3  |    3     |      1            --
-- 4  |    3     |      2            --
---------------------------------------

成分模型:

   public function recipes() {
        return $this->belongsToMany('App\Recipe', 'ingredient_recipe');
   }

成分控制器:

    public function read(Request $request)
    {
        //we search one or more id of ingredients (1=Potatoes, 2=Onions)
        $ingredients = Ingredient::findOrFail([1,2]);
        $recipes = [];
        foreach($ingredients as $ingredient) {
                $recipes = $ingredient->recipes()->get();
        }
      return view('home')->with('recipes', $recipes);
    }

查看:

    @foreach ($recipes as $recipe)
        {{$recipe->name}}
    @endforeach

我希望从查询中获取所有食谱,但实际上我只有两个食谱(洋葱食谱(id:2)和土豆洋葱食谱(id:3)。

我想念什么?

2 个答案:

答案 0 :(得分:1)

在您的控制器中,以下行引起了该问题:

$recipes = $ingredient->recipes()->get();

它只是保存最后一种食材的食谱。

我建议您将read方法的内容替换为此:

$ingredients = Ingredient::with('recipes')->findOrFail([1,2]);
$recipes = collect([]);
foreach($ingredients as $ingredient) {
    $recipes = $recipes->merge($ingredient->recipes);
}
return view('home')->with('recipes', $recipes);

答案 1 :(得分:0)

尝试以下。

成分控制器:

get {
  parameterMap { params =>
    if (params.size != 1) {
      complete(StatusCodes.BadRequest)
    } else {
      params.head match {
        case ("asd", value) =>
          // do something
          complete(StatusCodes.OK)
        case _ =>
          complete(StatusCodes.BadRequest)
      }
    }
  }
}