如果我有3张桌子:
用户,对话,消息
在用户和对话之间,我有
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');
在对话和消息之间:
$table->foreign('conversation_id')
->references('id')
->on('conversations')
->onDelete('restrict');
如果有人不小心尝试删除对话,则由于消息限制,应阻止他。但是删除用户的方式相同,我想同时删除对话和消息。
我该怎么做?
答案 0 :(得分:0)
您可以通过多种方法来完成此操作,其中一种方法就是在您的User
模型中进行以下操作
class User extends Model
{
public static function boot()
{
static::deleting(function ($model) {
// Remember that $model here is an instance of User
// Loop over conversations and delete
$model->conversations->each(function($conversation){
$conversation = tap($conversation)->delete();
// loop over the messages and delete
$conversation->messages->each(function($message){
$message->delete();
}):
});
});
}
}
希望有帮助。您还可以使用观察者类,或将其放在您的应用服务提供商中。调查laravel事件
答案 1 :(得分:0)
onDelete('cascade'); 只需将ON DELETE CASCADE规则添加到您的数据库,该规则指定在删除父数据时删除子数据。
因此,如果您的父数据(用户)被删除,所有子数据(对话)也将被删除。
如果将'-> onDelete('restrict'); '更改为'-> onDelete('cascade'); ',您将执行与 user 表(假设 conversations 是您的父数据,而 messages 是您的子数据)
https://laravel.com/docs/5.1/migrations#foreign-key-constraints
答案 2 :(得分:-1)
您应该在两个关系上都添加onDelete('cascade');
。第一个将删除所有消息,第二个将删除与每个消息的每次对话。
您必须更改 在对话和消息之间:
$table->foreign('conversation_id')
->references('id')
->on('conversations')
->onDelete('cascade'); //change restrict to cascade