Laravel 在删除以下任一行时,删除一对一关系中的每个对应行
我正在努力学习一对一的关系。我使用的是Laravel 5.5.13 我的简单应用程序是: 我创建了一个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
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 tablemessages
add constraintmessages\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
。