laravel - 使用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
表。before
sync
这是 的sync
数组$selectedScreenCategories
。
[
0 => ["screen_category_id" => 6]
1 => ["screen_category_id" => 3]
2 => ["screen_category_id" => 5]
]
这是pivot
表after
调用sync
方法。
我花了几个小时。仍然无法找到解决方案。
解决方案
解决方案。
只需将传入的数组的integer keys
in to更改为如下所示的函数。string keys
$selectedScreenCategories
sync
改变
[
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"
. 这将解决您的问题。
问题的原因。在运行函数之前
检查表中已经存在的记录。
该记录为。pivot
sync
screen_category_id = 1
$selectedScreenCategories
然后检查传递给sync
函数的数组。见下图。
当我们将此数组传递给sync
函数时,因为已经有一条记录screen_category_id = 1
,所以上面突出显示的记录是将已经存在的记录更新为的原因screen_category_id = 3
。现在我们有 2 条记录screen_category_id = 3
。
希望你能理解。
推荐阅读
- github - 如何在我的主页上删除其他人的 repo?
- reactjs - 如何在 React-Bootstrap 中调整表单控件的宽度
- laravel - 如何在 Laravel 动态路由中使用 str_replace
- node.js - npm 包元数据 api
- html - 此 HTML5 代码不播放音频和视频
- typescript - 为什么我在打字稿的前面枚举中需要`const`?
- math - 如何用汇编语言计算 x^y?
- java - 如何在不发送另一个身份验证请求的情况下保持来自跨源 (CORS) Spring 安全性的登录会话
- laravel - 使用 Eloquent 获取连接表的最小值
- html - 启动前端项目时如何定位div?你如何获得 CSS 样板代码设置?