Laravel 同步多个关系加上枢轴数据(不包括空数据)

发布于 2025-01-13 09:30:03 字数 1416 浏览 1 评论 0原文

我有一个多对多关系,RecipesIngredients。我正在尝试将多个成分同步到食谱。我有一个编辑表单,我可以在其中发送食谱和所有成分的列表。

在我的 ingredient_recipe 表中,我有两个额外的数据透视列:number1number2

在我的表单中,我有两个下拉菜单,简化如下:

<select name="{{ $ingredient->id }}[number1]">
    <option></option> // Empty value
    <option value="example1">Example 1</option>
    <option value="example2">Example 2</option>
</select>

<select name="{{ $ingredient->id }}[number2]">
    <option></option> // Empty value
    <option value="example1">Example 1</option>
    <option value="example2">Example 2</option>
</select>

提交表单时,我得到以下结果:

array:2 [▼
  1 => array:2 [▼
    "number1" => example1
    "number2" => example2
  ]
  2 => array:2 [▼
    "number1" => example2
    "number2" => example1
  ]
]

在我的控制器的 update 方法中,我正在执行以下操作以将成分同步到配方:

$recipe->ingredients()->sync($ingredients);

其中 $ingredients 是上面发布的请求的输出。

虽然这确实可以完美地工作,但它也会同步下拉列表中没有选择的值,因为 $ingredient->id 将始终被提交。

关于我如何处理这个问题,我有两个问题。

  1. 我的主要问题是,如何避免具有空下拉值的成分同步?
  2. 我认为这似乎是我想要实现的目标的错误解决方案,如果是这样,有任何指向正确方向的指针吗?

I have a many-to-many relation, Recipes and Ingredients. I am trying to sync multiple ingredients to a recipe. I have an edit form where I send a recipe and a list of all ingredients.

In my ingredient_recipe table I have two extra pivot columns, number1 and number2.

In my form I have two dropdowns, simplified below:

<select name="{{ $ingredient->id }}[number1]">
    <option></option> // Empty value
    <option value="example1">Example 1</option>
    <option value="example2">Example 2</option>
</select>

<select name="{{ $ingredient->id }}[number2]">
    <option></option> // Empty value
    <option value="example1">Example 1</option>
    <option value="example2">Example 2</option>
</select>

When submitting the form, I get the following results:

array:2 [▼
  1 => array:2 [▼
    "number1" => example1
    "number2" => example2
  ]
  2 => array:2 [▼
    "number1" => example2
    "number2" => example1
  ]
]

In my controller's update method I am doing the following to sync the ingredients to the recipe:

$recipe->ingredients()->sync($ingredients);

Where $ingredients is the output of the request posted above.

While this does work flawlessly, it also syncs the values that have no selection in the dropdowns, because the $ingredient->id will always be submitted.

I have two questions about how I am approaching this.

  1. My main question is, how to avoid that ingredients with empty dropdown values get synced?
  2. It seems like a wrong solution to what I want to achieve I think, if so, any pointers in the right direction?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜吻♂芭芘 2025-01-20 09:30:04

我最终做的是以下内容:

foreach($ingredients as $key => $value)
{
    if(is_null($value['number1']) || is_null($value['number2']))
    {
        unset($ingredients[$key]);
    }
}

这会检查 number1number2 是否为空,如果是,它会从数组中删除整个成分,因此只有选定的值会被删除。已同步。

What I ended up doing is the following:

foreach($ingredients as $key => $value)
{
    if(is_null($value['number1']) || is_null($value['number2']))
    {
        unset($ingredients[$key]);
    }
}

This checks if either number1 or number2 is empty and if so, it removes the whole ingredient from the array so only selected values will be synced.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文