【问题标题】:Laravel message: Integrity constraint violation: 1451Laravel 消息:违反完整性约束:1451
【发布时间】:2020-06-18 20:45:12
【问题描述】:

我仍在学习 Laravel,当我想从数据库中删除记录时遇到了问题。很可能我错过了一些简单的东西。

我有一个如下所示的推文迁移:

    public function up()
{
    Schema::create('tweets', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->foreignId('user_id');
        $table->string('body');
        $table->timestamps();
    });
}

还有一个likes-migration的帽子是这样的:

    public function up()
{
    Schema::create('likes', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->foreignId('user_id')->constrained()->cascadeOnDelete;
        $table->foreignId('tweet_id')->constrained()->cascadeOnDelete;
        $table->boolean('liked');
        $table->timestamps();

        $table->unique(['user_id', 'tweet_id']);
    });
}

当我在修补时我说

$tweet->delete();

只有当它没有喜欢时,它才会删除推文记录。 如果推文有赞,我会收到错误消息:

Illuminate/Database/QueryException with message 'SQLSTATE[23000]: Integrity constraint violation : 1451 Cannot delete or update a parrent row: a foreign key constraint fails...."

我认为我在迁移过程中犯了一个非常基本的错误,但我不知道是哪个。

谁能给点建议?

亲切的问候,

休伯特

【问题讨论】:

标签: database laravel


【解决方案1】:

当您删除具有关联外键的模型时,您必须进行清理。你想级联它,你的语法似乎不对,我不确定它是否是另一种方式。通常你会这样做。

$table->foreign('user_id')
    ->references('id')->on('users')
    ->onDelete('cascade');

$table->foreign('tweet_id')
    ->references('id')->on('tweets')
    ->onDelete('cascade');

可以使用更新版本的 on delete 级联。

$table->foreignId('user_id')
    ->constrained()
    ->onDelete('cascade');

【讨论】:

  • 我假设我正在这样做。使用“ $table->foreignId('tweet_id')->constrained()->cascadeOnDelete;”我假设我在删除推文时正在删除对 Likes 表中推文的引用?
  • 正如我告诉你的语法似乎不正确,通常所有模式调用都是方法而不是属性访问。我用另一个例子更新了它,检查数据库是否级联。
  • 正如我看到你的个人资料,你有 6 个问题没有接受答案,只是为了你的信息,实际接受对你有帮助的答案是一种普遍的礼貌,我不在乎你做什么和我的一样,但尊重那些在这里提供帮助的人,你至少可以为社区做点什么
  • 将“cascadeOnDelete”更改为“onDelete('cascade')”就可以了。谢谢。我不明白我在哪里得到了 cascadeOnDelete!当我运行原始(错误)迁移时,我也没有收到错误消息。
  • 可能是因为您访问了一个属性,所以如果它有帮助,您可以接受它作为答案。你也可以回到过去,接受对你有帮助的答案;)祝你有美好的一天
【解决方案2】:

->cascadeOnUpdate() 是一个正确的辅助方法(它是其他人建议的 ->onUpdate('cascade') 的替代品)但看起来你忘记了括号。如果您将其更正为以下内容,它应该可以工作:

public function up()
{
    Schema::create('likes', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->foreignId('user_id')->constrained()->cascadeOnDelete();
        $table->foreignId('tweet_id')->constrained()->cascadeOnDelete();
        $table->boolean('liked');
        $table->timestamps();

        $table->unique(['user_id', 'tweet_id']);
    });
}

【讨论】:

    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 2019-04-12
    • 2016-08-11
    • 1970-01-01
    • 2019-01-02
    • 2017-09-11
    • 2020-06-14
    相关资源
    最近更新 更多