【问题标题】:Laravel Many to Many Relationship mixes up id's in insertLaravel 多对多关系在插入中混淆了 id
【发布时间】: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,CONSTRAINT advertisement2advcategory_advertisementcategory_id_foreign FOREIGN KEY(advertisementCategory_id)参考advertisementCategory (i) (SQL: insert into advertisement2advCategory (advertisementCategory_id, advertisement_id`) 值 (19, 4))

【问题讨论】:

  • 顺便说一句,您不要将foreignIdforeign 用于同一个字段...foreignId 创建实际字段并创建外部引用
  • 谢谢,删除了 foreignId 的东西。从来没有任何错误,但这使它更具可读性。 @lagbox
  • belongsToMany 调用的外键向后,切换第三和第四个参数
  • 在它的文档中:belongsToMany(related, table, foreignPivotKey, relatedPivotKey);据我了解,我使用了正确的顺序。 @lagbox
  • 对,但你误解了这些意思,你把它们倒过来了......不,你没有按正确的顺序排列它们......“第三个参数是模型的外键名称您正在定义关系,而第四个参数是您要加入的模型的外键名称”

标签: php mysql laravel


【解决方案1】:

您需要将第三个和第四个参数的顺序切换为belongsToMany。事物的命名方式有点令人困惑,但根据文档:

“第三个参数是您要定义关系的模型的外键名称,而第四个参数是您要加入的模型的外键名称。” - Laravel 8.x Docs - Eloquent - Relationships - Many to Many - Model Structure

因此,如果您在 Category 模型上定义与 Advertisement 的关系,那么第三个参数是引用 categories (category_id) 的外键。第 4 个参数是引用另一个模型/表 advertisements (advertisement_id) 的外键。

【讨论】:

    猜你喜欢
    • 2014-02-25
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 2015-03-16
    • 1970-01-01
    • 2020-07-06
    • 2016-10-05
    相关资源
    最近更新 更多