1

我以为我在发展我的 Laravel 技能方面进展顺利,但似乎我被卡住了,还无法在网上找到解决方案。

我的项目是在 Laravel 和 Vue 中建立的,我正在尝试存储带有成分的产品。产品在产品表中。成分表中的成分。我成功地用brand_id存储了产品,然后检索了品牌(一对多),但我不知道如何为多对多做到这一点:产品的成分。

由于我正在使用 Vue,因此我添加了用于发布我的数据的 JSON 输出。

public function store()
{
    $product = new Product();

    $product->ean =             request('ean');
    $product->name =            request('productName');
    $product->brand_id =        request('brandId');

    $ingredients =              request('ingredients');

    $product->save();
}

正如我上面解释的那样,保存产品进展顺利。但是现在我需要对 $ingredients 数组做一些事情,我发现了这样的行:

$user->roles()->save($role);

所以我认为我必须为所有成分做一个 foreach 循环,并在其中执行此操作:

$product->ingredients()->save($ingredient);

我无法理解。该数组将包含已存储的现有成分,但也包含必须添加到成分表中的新成分。如何使这项工作?

因此,将新成分存储在它的表中,并将关系存储在 eloquent 表中。我可能很近,我可能很远,有人吗?

4

1 回答 1

1

在循环成分时,查看firstOrNew()方法:

foreach($request->input("ingredients") AS $ingredient){
  $ingredient = Ingredient::firstOrNew(["name" => $ingredient]);
  // Note: assumed name for column that matches `$ingredient` from array, adjust as needed.
}

在那个循环中,attach()$ingredient的新$product. 完全实现后,您的代码应如下所示:

$product = new Product();
...
$product->save();

foreach($request->input("ingredients") AS $ingredient){
  $ingredient = Ingredient::firstOrNew(["name" => $ingredient]);
  $product->ingredients()->attach($ingredient->id); 
}

attach()将通过向和之间的枢轴添加一条记录,将这个新的或现有$ingredient的与新的相关联。您不能使用的原因是这是 a ,它需要. 用于一个.$productProductIngredient$product->ingredients()->save($ingredient);many-to-manyattach()$model->relationship()->save();one-to-many

可以在此处找到有关创建方法的完整文档:https ://laravel.com/docs/5.8/eloquent#other-creation-methods

于 2019-06-26T20:50:26.260 回答