【发布时间】:2022-01-02 21:08:34
【问题描述】:
我遇到了问题,我的数据透视表的 FK 的 ID 在插入之前混淆了,因此我收到一个错误,因为 ID 高的类别不可用。
这是我尝试插入的方法:
$newAdvertisement = new Advertisement();
$newAdvertisement->name = $request->name;
$newAdvertisement->save();
$newAdvertisement->advertisementCategories()->attach($request->selectedCategory);
广告迁移和类函数:
public function advertisementCategories(): BelongsToMany
{
return $this->belongsToMany(
AdvertisementCategory::class,
'advertisement2advCategory',
'advertisementCategory_id',
'advertisement_id'
);
}
//Advertisement
Schema::create('advertisement', function (Blueprint $table) {
$table->id();
$table->string('name')->default('');
});
这里还有category类的功能和迁移:
public function advertisements(): BelongsToMany
{
return $this->belongsToMany(
Advertisement::class,
'advertisement2advCategory',
'advertisement_id',
'advertisementCategory_id'
);
}
Schema::create('advertisement2advCategory', function (Blueprint $table) {
$table->foreignId('advertisement_id');
$table->foreign('advertisement_id')
->references('id')
->on('advertisement')
->onDelete('cascade');
$table->foreignId('advertisementCategory_id');
$table->foreign('advertisementCategory_id')
->references('id')
->on('advertisementCategory')
->onDelete('cascade');
});
在错误消息中您可以清楚地看到,advertising_id 和advertisingCategory_id 混淆了...... 在此示例中,已创建 ID 为 19 的广告,并且所选类别(存在)的 ID 为 4,但生成的 sql 尝试插入 ID 为 4 的广告和 ID 为 19 的笼子。到底如何?
我使用的是最新版本的 laravel 和 php 8.1.1
SQLSTATE[23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(
umarketdb.advertisement2advCategory,CONSTRAINTadvertisement2advcategory_advertisementcategory_id_foreignFOREIGN KEY(advertisementCategory_id)参考advertisementCategory(i) (SQL: insert intoadvertisement2advCategory(advertisementCategory_id,advertisement_id`) 值 (19, 4))
【问题讨论】:
-
顺便说一句,您不要将
foreignId和foreign用于同一个字段...foreignId创建实际字段并创建外部引用 -
谢谢,删除了 foreignId 的东西。从来没有任何错误,但这使它更具可读性。 @lagbox
-
belongsToMany调用的外键向后,切换第三和第四个参数 -
在它的文档中:belongsToMany(related, table, foreignPivotKey, relatedPivotKey);据我了解,我使用了正确的顺序。 @lagbox
-
对,但你误解了这些意思,你把它们倒过来了......不,你没有按正确的顺序排列它们......“第三个参数是模型的外键名称您正在定义关系,而第四个参数是您要加入的模型的外键名称”