中间表删除,使用的时detach
如果我们想自动删除呢,不需要手动使用这个函数时,有没办法,当然有的
第一种直接方法boot方法
比如我景点关联了tag标签,我现在要删除景点,同时tag标签中间表也要删除。
这里之说删除,当然你可以做很多的事情,例如全局查询返回,关联更新等
我们的目的时让智能来减少我们的代码量,让包装更加好看,让代码越写越少。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Scenic extends Model
{
public function tags()
{
return $this->morphToMany('App\Models\Tag','model', 'tag_rels');
}
public function areas()
{
return $this->hasOne('App\Models\AreaRel','model_id','id')->where('model_type','scenic');
}
public static function getList(){
return self::where('is_checked',1)->get();
}
public static function boot()
{
// 调用deleting函数时
static::deleting(function ($model) {
if (method_exists($model, 'isForceDeleting') && ! $model->isForceDeleting()) {
return;
}
//我们上面定义的关联
$model->tags()->detach();
});
}
}
第二种使用Trait,方便是可插拔,跟插头一样,不用就拔掉
这个文件位置随便你写,只要你正确书写的类能找到即可
例如我的:app/Classc/ScenicTrait.php
<?php
namespace App\Classc;
trait ScenicTrait
{
public static function bootScenicTrait()
{
static::deleting(function ($model) {
if (method_exists($model, 'isForceDeleting') && ! $model->isForceDeleting()) {
return;
}
$model->tags()->detach();
});
}
}
使用
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use App\Classc\ScenicTrait;
class Scenic extends Model
{
//
use ScenicTrait;
...
}
网友评论