在删除之前是否需要取消链接? Laravel 5.2

时间:2016-06-29 22:13:53

标签: php laravel

这应该是一个相当简单的问题,我可能会对我的问题得到解答的文档中的确切位置愚蠢/盲目但是:

Blog has many tags, tags belong to blog
post has many tags, tags belong to post

如果我这样做:TagModel::where('id', $id)->first()->delete();会处理这些关系吗?如果我这样做:BlogsModel::where('id', $blogId)->tags或甚至查看帖子,我不会看到已删除标签的关系,或者我是否需要首先从博客和帖子取消链接然后删除? ?

我认为laravel不会先找我链接吗?

2 个答案:

答案 0 :(得分:2)

Laravel关系用于调用关系成员,它不用于删除,如果要自动删除关系表,有两种方法:

  1. 您需要在具有删除功能的数据库上添加关系

    $table->foreign('blog_id')->references('id')->on('blog')->onDelete('cascade');
    $table->foreign('post_id')->references('id')->on('blog')->onDelete('cascade');
    
    1. 您可以在模型上添加删除功能

      您需要将此功能添加到代码模型中:

      // Adding relation from tags to post
      public function post()
      {
          return $this->belongsTo( PostModel::class, 'post_id' );
      }
      
      // Adding relation from tags to blog
      public function blog()
      {
          return $this->belongsTo( BlogModel::class, 'blog_id' );
      }
      
      // Deleting relation table blog and post
      protected static function boot() {
          parent::boot();
      
          static::deleting( function( $tag ) {
              $tag->blog()->delete();
              $tag->post()->delete();
          });
      }
      
    2. 所以当你运行这个函数时:

      TagModel::where('id', $id)->first()->delete();
      

      相关博客和帖子会自动删除。

      如果您要删除标签及相关博客并发布未删除的内容,请不要在数据库中建立任何关系。

答案 1 :(得分:0)

关键是模型事件deleting

/**
 * Events
 */
public static function boot()
{
    parent::boot();

    static::deleting(function($model) {
        foreach($model->tags as $tag) {
            $tag->delete();
        }      
    }
}

此代码可以存在于模型本身中,也可以将其提取给模型观察者。