使用 laravel 同步方法插入数据时数据重复?

Data duplicate when insert the data using laravel sync method?

我已经使用 laravel sync 方法建立 belongsToMany 关系。调用该方法后,有时会向pivot插入重复数据table.

这个code我用过

{

    $selectedScreenCategories = $this->screenCategorySiteFieldsModel->addSameKeyForElementsInArray($screenCategoryIds,'screen_category_id');
    $siteField->screenCategories()->sync($selectedScreenCategories);

}

这是用于创建 pivot table 的 migration

{
    {
    public function up()
        {
            Schema::create('site_field_screen_categories',function (Blueprint $table){
                $table->increments('id');
                $table->unsignedInteger('screen_category_site_field_id')->nullable(false);
                $table->unsignedInteger('screen_category_id')->nullable(false);                
                $table->foreign('screen_category_site_field_id','screen_category_site_field_id')->references('id')->on('screen_category_site_fields');                            
                $table->foreign('screen_category_id')->references('id')->on('screen_categories');
            });
        }
    }
}

这是belongsToMany关系。

function screenCategories(){
    return  $this->belongsToMany('App\ScreenCategory','site_field_screen_categories','screen_category_site_field_id','screen_category_id');
}

这是 pivot table before 调用 sync 方法。

这是 $selectedScreenCategoriessync 数组。

[
    0 => ["screen_category_id" => 6]
    1 => ["screen_category_id" => 3]
    2 => ["screen_category_id" => 5]
]    

这是 pivot table after 调用 sync 方法。

我花了好几个小时。仍然无法找到解决方案。

如果您希望组合在主元 table 中是唯一的,请从主元 table 中删除 id。为了停止重复记录,您需要制作唯一键。在你当前table id是主键和增量。

您可以删除 id 并创建复合主键,如

$table->primary(['screen_category_site_field_id', 'screen_category_id']);

以上将真正强制执行唯一数据。

或者您可以保持 table 不变,先分离数据,然后再次同步。

解决方案。
只需将传递给 sync 函数的数组 $selectedScreenCategoriesinteger keys 更改为 string keys,如下所示。

改变

[
    0 => ["screen_category_id" => 6]
    1 => ["screen_category_id" => 3]
    2 => ["screen_category_id" => 5]
]  

进入

[
    "Gfdsj" => ["screen_category_id" => 6]
    "pQrst" => ["screen_category_id" => 3]
    "uvWzy" => ["screen_category_id" => 5]
]  

您可以使用 str_random(5) php 函数生成随机字符串,例如 "Gfdsj"。这将解决您的问题。

问题原因。
sync函数运行之前检查pivottable的已经存在的记录。
screen_category_id = 1.

的记录

然后检查传递给sync函数的数组$selectedScreenCategories。见下图。

当我们将此数组传递给 sync 函数时,因为已经有 screen_category_id = 1 的记录,所以上面突出显示的记录是将现有记录更新为 screen_category_id = 3 的原因.现在我们有 screen_category_id = 3 的 2 条记录。
希望你能理解。