使用 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
方法。
这是 $selectedScreenCategories
的 sync
数组。
[
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
函数的数组 $selectedScreenCategories
的 integer 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
函数运行之前检查pivot
table的已经存在的记录。
screen_category_id = 1
.
的记录
然后检查传递给sync
函数的数组$selectedScreenCategories
。见下图。
当我们将此数组传递给 sync
函数时,因为已经有 screen_category_id = 1
的记录,所以上面突出显示的记录是将现有记录更新为 screen_category_id = 3
的原因.现在我们有 screen_category_id = 3
的 2 条记录。
希望你能理解。
我已经使用 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
方法。
$selectedScreenCategories
的 sync
数组。
[
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
函数的数组 $selectedScreenCategories
的 integer 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
函数运行之前检查pivot
table的已经存在的记录。
screen_category_id = 1
.
然后检查传递给sync
函数的数组$selectedScreenCategories
。见下图。
当我们将此数组传递给 sync
函数时,因为已经有 screen_category_id = 1
的记录,所以上面突出显示的记录是将现有记录更新为 screen_category_id = 3
的原因.现在我们有 screen_category_id = 3
的 2 条记录。
希望你能理解。