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。
你没有做任何代码,你可以在数据库中设置并在与关系的级联上设置删除。
我正在尝试调用模型事件 - 已删除。当我删除视频时,我还想删除与视频相关的所有评论,效果很好。但我也有提要 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。
你没有做任何代码,你可以在数据库中设置并在与关系的级联上设置删除。