Database Laravel消息:完整性约束冲突:1451

Database Laravel消息:完整性约束冲突:1451,database,laravel,Database,Laravel,我还在学习Laravel,当我想从数据库中删除记录时遇到了一个问题。很可能我错过了一些简单的东西 我有一个tweet迁移,如下所示: public function up() { Schema::create('tweets', function (Blueprint $table) { $table->bigIncrements('id'); $table->foreignId('user_id'); $table-&

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

我有一个tweet迁移,如下所示:

    public function up()
{
    Schema::create('tweets', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->foreignId('user_id');
        $table->string('body');
        $table->timestamps();
    });
}
    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']);
    });
}
还有一个类似迁移的帽子,看起来像这样:

    public function up()
{
    Schema::create('tweets', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->foreignId('user_id');
        $table->string('body');
        $table->timestamps();
    });
}
    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();
只有在没有喜欢的时候,它才会删除推特记录。 如果tweet有likes,我会得到以下错误:

Illuminate/Database/QueryException with message 'SQLSTATE[23000]: Integrity constraint violation : 1451 Cannot delete or update a parrent row: a foreign key constraint fails...."
我想我在迁移过程中犯了一个非常基本的错误,但我不知道是哪个

谁能提供建议

亲切问候,


Hubert

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

$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');
->cascadeoupdate()
是一个正确的辅助方法(它是其他人建议的
->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']);
    });
}

我假设我正在这样做。使用“$table->foreigned('tweet_id')->constrained()->cascadeOnDelete;”我假设在删除tweet时,我正在删除Likes表中对tweet的引用?正如我告诉您的,语法似乎不正确,通常所有模式调用都是方法,而不是属性访问。我用另一个例子更新了它,如果它级联,请检查数据库。正如我看到的你的个人资料,你有6个问题没有被接受的答案,只是为了你的信息,实际上接受帮助你的答案是一种常见的礼貌,我不在乎你对我的答案做了什么,但尊重那些在这里帮助你的人,您至少可以为社区做些什么将“cascadeOnDelete”更改为“ondelet('cascade')”就成功了。塔克斯。我不明白我是从哪里弄来的!另外,我在运行原始(错误)迁移时没有收到错误消息。可能是因为您访问了一个属性,因此如果它有帮助,您可以接受它作为答案。你也可以回到过去,接受帮助你的答案;)祝你有愉快的一天这可能对你有帮助。另外,您使用的是哪个版本?laravel