Laravel 同步多个关系加上不包括空数据的数据透视表

Laravel syncing multiple relations plus pivot data excluding empty data

我有一个多对多关系,RecipesIngredients。我正在尝试将多个 ingredients 同步到一个 recipe。我有一个编辑表单,我在其中发送 recipe 和所有 ingredients.

的列表

在我的 ingredient_recipe table 中,我有两个额外的数据透视列,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. 我认为这似乎是我想要实现的目标的错误解决方案,如果是这样,是否有任何正确方向的指示?

我最后做了以下事情:

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

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