首页 > 解决方案 > 使用laravel同步方法插入数据时数据重复?

问题描述

我已经使用laravel sync方法来belongsToMany建立关系。调用此方法后,有时会将重复数据插入到数据透视表中。

这是code我用过的。

{

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

}

migration是用于创建pivot表的。

{
    {
    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表。beforesync

在此处输入图像描述 这是 的sync数组$selectedScreenCategories

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

这是pivotafter调用sync方法。

在此处输入图像描述

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

标签: laraveleloquentsynchronization

解决方案


解决方案。
只需将传入的数组的integer keysin to更改为如下所示的函数。string keys$selectedScreenCategoriessync

改变

[
    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". 这将解决您的问题。

问题的原因。在运行函数之前
检查表中已经存在的记录。 该记录为。pivotsync
screen_category_id = 1

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

在此处输入图像描述

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


推荐阅读