Laravel 删除对象时调用模型事件 - 已删除

Laravel on delete objects call model event - deleted

我正在尝试调用模型事件 - 已删除。当我删除视频时,我还想删除与视频相关的所有评论,效果很好。但我也有提要 table,当我删除视频时,我还想删除所有评论和评论提要。现在,当我删除视频时,我删除了 - 视频、视频评论、视频提要,但我还需要删除视频评论提要。

问题是我如何才能在删除视频时同时删除评论提要? 检查VideoController.php销毁函数

Video.php - 型号

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Cviebrock\EloquentSluggable\Sluggable;

class Video extends Model
{

    protected $table = 'videos';
    public $timestamps = false;
    use Sluggable, RecordsFeed;

    public static function boot()
    {
        parent::boot();
    }

    public function sluggable()
    {
      return [
          'slug' => [
              'source' => 'title'
          ]
        ];
    }

    public function comments()
    {
      return $this->hasMany('App\VideoComment', 'videoid', 'id');
    }

    public function member()
    {
      return $this->belongsTo('App\Member', 'userid', 'member_id');
    }

}

VideoComments.php - 型号

    <?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class VideoComment extends Model
{
    protected $table = 'videos_comments';
    public $timestamps = false;
    protected $fillable = [
      'text', 'userid', 'date'
    ];
    use RecordsFeed;

    public function videos() {
      return $this->belongsTo('App\Video', 'id', 'videoid');
    }
    public function member() {
      return $this->belongsTo('App\Member', 'userid', 'member_id');
    }
}

RecordsFeed.php

    <?php

namespace App;
use App\Libraries\Portal;

trait RecordsFeed
{

    protected static function bootRecordsFeed() {

        static::created(function($model) {
            $model->recordFeed('created');
        });

        static::deleted(function($model) {
            $model->deleteFeed('deleted');
        });

    }

    public function feeds() {
        return $this->morphMany( Feed::class, 'feedable' );
    }

    protected function recordFeed($event) {
        $this->feeds()->create([
            'user_id' => (new Portal)->getMemberID(),
            'type' => $event.'_'.strtolower(class_basename($this))
        ]);
    }

    protected function deleteFeed($event) {
        $this->feeds()->delete();
    }

}

VideoController.php 销毁函数

public function destroy($id)
{
    $video = Video::findOrFail($id);
    $video->comments()->delete();
    $video->delete();

    Session::flash('success', 'Video deleted');
    return redirect()->route('video.index');
}

为什么不在创建 table 时使用 on delete cascade?

在您的迁移中,当您创建外键时,只需像这样指定删除操作:

$table->foreign('your_key')->references('id')->on('your_table')->onDelete('cascade');

它将自动删除与父对象关联的行。

您可以在 Laravel 文档中找到更多详细信息 here

你没有做任何代码,你可以在数据库中设置并在与关系的级联上设置删除。