删除一对一关系中的每个对应行

Delete each corresponding row in One-to-One relationship on delete of either

我正在尝试学习一对一关系。我正在使用 Laravel 5.5.13.

我的简单应用是这样的:

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

我的目标:

但是我在迁移时遇到错误,因为 tasks_table 是在 messages_table.

之后创建的

这是我的迁移:

2017_10_15_021803_create_messages_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

    });
}

而对于 App\Task 2017_10_15_023343_create_tasks_table.php:

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');
    });
}

如果我注释掉 $table->foreign('task_id')->references('id')->on('tasks')->onDelete('cascade'); 则迁移工作正常,但是我需要在删除任务时删除消息,没有这行就不会发生。

我在 运行 php artisan migrate 之后得到的错误是:

[Illuminate\Database\QueryException] SQLSTATE[HY000]: General error: 1005 Can't create table petfolk.#sql-42e8_16f (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table messages add constraint messages_task_id_foreign foreign key (task_id) references tasks (id) on delete set null)

[PDOException] SQLSTATE[HY000]: General error: 1005 Can't create table petfolk.#sql-42e8_16f (errno: 150 "Foreign key constraint is incorrectly formed")

一对一关系 link 数据库中的一行 table 到另一个 table 中的一行(且只有一行)。

onDelete('cascade') 在多对多关系中的两个 table 之间存在中间值(也称为枢轴)table 时使用。一对一关系不需要这个,因为消息 table 的 link 仅存在于任务 table 的行中(并且正在被删除)。

为任务尝试这个 table 迁移:

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');
}

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