删除一对一关系中的每个对应行
Delete each corresponding row in One-to-One relationship on delete of either
我正在尝试学习一对一关系。我正在使用 Laravel 5.5.13.
我的简单应用是这样的:
我创建了一个App\Message
。我可以选择将 App\Task
与之相关联。
我的目标:
- 关联
App\Task
后,如果任务被删除,它应该级联删除 App\Message
行。
- 反之,如果
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');
}
当两个表都被创建时,它将起作用。
我正在尝试学习一对一关系。我正在使用 Laravel 5.5.13.
我的简单应用是这样的:
我创建了一个App\Message
。我可以选择将 App\Task
与之相关联。
我的目标:
- 关联
App\Task
后,如果任务被删除,它应该级联删除App\Message
行。 - 反之,如果
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 tablemessages
add constraintmessages_task_id_foreign
foreign key (task_id
) referencestasks
(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');
}
当两个表都被创建时,它将起作用。