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

Isu*_*igo 1 synchronization laravel eloquent

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

这是code我用过的。

{

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

}
Run Code Online (Sandbox Code Playgroud)

这是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');
            });
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

这就是belongsToMany关系。

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

这是调用该方法的pivot表。beforesync

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

[
    0 => ["screen_category_id" => 6]
    1 => ["screen_category_id" => 3]
    2 => ["screen_category_id" => 5]
]    
Run Code Online (Sandbox Code Playgroud)

这就是pivotafter调用sync方法。

在此输入图像描述

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

gih*_*nka 7

解决方案。只需将传递给函数的数组的in
更改为如下所示。integer keysstring keys$selectedScreenCategoriessync

改变

[
    0 => ["screen_category_id" => 6]
    1 => ["screen_category_id" => 3]
    2 => ["screen_category_id" => 5]
]  
Run Code Online (Sandbox Code Playgroud)

进入

[
    "Gfdsj" => ["screen_category_id" => 6]
    "pQrst" => ["screen_category_id" => 3]
    "uvWzy" => ["screen_category_id" => 5]
]  
Run Code Online (Sandbox Code Playgroud)

您可以使用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
希望你能理解。