多关系外键

时间:2019-06-15 16:36:48

标签: mysql laravel

如果我有3张桌子:

用户,对话,消息

在用户和对话之间,我有

$table->foreign('user_id')
                  ->references('id')
                  ->on('users')
                  ->onDelete('cascade');

在对话和消息之间:

$table->foreign('conversation_id')
                  ->references('id')
                  ->on('conversations')
                  ->onDelete('restrict');

如果有人不小心尝试删除对话,则由于消息限制,应阻止他。但是删除用户的方式相同,我想同时删除对话和消息。

我该怎么做?

3 个答案:

答案 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