Laravel 在删除以下任一行时,删除一对一关系中的每个对应行

Laravel 在删除以下任一行时,删除一对一关系中的每个对应行,laravel,laravel-5.5,Laravel,Laravel 5.5,我正在努力学习一对一的关系。我使用的是Laravel 5.5.13 我的简单应用程序是: 我创建了一个App\Message。我可以选择将App\Task与其关联 我的目标是: 一旦关联了App\Task,如果任务被删除,它应该级联删除App\Message行 反之,如果删除了App\Message,则应级联并删除App\Task行 但是,我在迁移时出错,因为任务表是在消息表之后创建的 以下是我的迁移: public function up() { Schema::create('t

我正在努力学习一对一的关系。我使用的是Laravel 5.5.13

我的简单应用程序是:

我创建了一个
App\Message
。我可以选择将
App\Task
与其关联

我的目标是:

  • 一旦关联了
    App\Task
    ,如果任务被删除,它应该级联删除
    App\Message
  • 反之,如果删除了
    App\Message
    ,则应级联并删除
    App\Task
但是,我在迁移时出错,因为
任务表
是在
消息表
之后创建的

以下是我的迁移:

public function up()
{
    Schema::create('tasks', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('message_id')->unsigned()->nullable();
        $table->foreign('message_id')->references('id')->on('messages');
        $table->timestamps();

    });
}
Schema::table('messages', function (Blueprint $table) {
    $table->foreign('task_id')->references('id')->on('tasks')->onDelete('cascade');
}
2017\u 10\u 15\u 021803\u create\u messages\u table.php

public function up()
{
    Schema::create('messages', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('task_id')->unsigned()->nullable();
        $table->text('body');
        $table->timestamps();

        $table->foreign('task_id')->references('id')->on('tasks')->onDelete('cascade'); //// IF I COMMENT THIS OUT THE MIGRATION WORKS, BUT I NEED THIS IN

    });
}
public function up()
{
    Schema::create('tasks', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('message_id')->unsigned();
        $table->timestamps();

        $table->foreign('message_id')->references('id')->on('messages')->onDelete('cascade');
    });
}
对于
App\Task
2017\u 10\u 15\u 023343\u create\u tasks\u table.php

public function up()
{
    Schema::create('messages', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('task_id')->unsigned()->nullable();
        $table->text('body');
        $table->timestamps();

        $table->foreign('task_id')->references('id')->on('tasks')->onDelete('cascade'); //// IF I COMMENT THIS OUT THE MIGRATION WORKS, BUT I NEED THIS IN

    });
}
public function up()
{
    Schema::create('tasks', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('message_id')->unsigned();
        $table->timestamps();

        $table->foreign('message_id')->references('id')->on('messages')->onDelete('cascade');
    });
}
如果我在('tasks')->onDelete('cascade')上注释掉
$table->foreign('task_id')->references('id')->引用('id')->然后迁移工作,但是我需要在任务被删除时删除消息,没有这一行就不会发生这种情况

运行
php artisan migrate
后出现的错误是:

[照亮\数据库\查询异常] SQLSTATE[HY000]:一般错误:1005无法创建表
petfolk
\sql-42e8\u 16f
(errno:150“外键约束格式不正确”)(sql:alter table
messages
add constraint
messages\u task\u id\u Foreign
外键(
task\u id
)引用
任务
id
)删除时设置为空)

[例外情况] SQLSTATE[HY000]:一般错误:1005无法创建表
petfolk
\sql-42e8_16f
(错误号:150“外键约束格式不正确”)


一对一关系将数据库表中的一行链接到另一个表中的一行(且仅一行)

onDelete('cascade')
用于在多对多关系中的两个表之间存在中间表(也称为透视表)的情况。对于一对一关系,您不需要这样做,因为到messages表的链接只存在于tasks表的行中(该行正在被删除)

对于任务表迁移,请尝试以下操作:

public function up()
{
    Schema::create('tasks', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('message_id')->unsigned()->nullable();
        $table->foreign('message_id')->references('id')->on('messages');
        $table->timestamps();

    });
}
Schema::table('messages', function (Blueprint $table) {
    $table->foreign('task_id')->references('id')->on('tasks')->onDelete('cascade');
}

只需创建第三次迁移并在迁移中移动外键添加逻辑:

public function up()
{
    Schema::create('tasks', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('message_id')->unsigned()->nullable();
        $table->foreign('message_id')->references('id')->on('messages');
        $table->timestamps();

    });
}
Schema::table('messages', function (Blueprint $table) {
    $table->foreign('task_id')->references('id')->on('tasks')->onDelete('cascade');
}

当两个表都被创建时,它将起作用。

您得到的错误是什么?感谢@OmarTarek的快速回复和提醒!我添加了错误信息。谢谢谢谢Kerrin,但是如果删除了
App\Message
行,如何使其删除相应的
App\Task
行?反之亦然?
onDelete('cascade')
与多对多或一对一关系无关。这是一篇关于级联删除的好文章,是的,我只是回来纠正这个问题。外键如上所述就位后,
onDelete('cascade')
将按预期工作。@kerlin它仍然不工作,因为还没有
消息
表。只有在
2017\u 10\u 15\u 021803\u create\u messages\u table.php
execution之后才会创建此表。哦,错误是因为还没有消息表!!!不是因为没有任务表(这就是我所想的)!!哇,非常感谢先生,您对其他解决方案的评论非常有用!调用第三次迁移,如
2017\u 10\u 15\u 024000\u add\u foreign\u key\u to\u messages\u table.php
,它将在您显示的两次迁移后执行。您是否从第一次迁移中删除了
$table->foreign('task\u id')…
,错误应该与您发布的错误不同。您使用的是
Schema::create
而不是
Schema::table
。请看我答案中的代码,它使用
Schema::table