在我的laravel项目中,我想使用一个特性来使用uuid
作为主键并进行级联删除。
有两种型号:User
和Box
。
user
可以包含多个Box
,Box
也可以包含多个Box
。
因为我使用mysql,onDelete('cascade')
无效,我需要它。
所以我覆盖模型的Boot
方法来强制它,但是现在,我的特征的Boot方法(UuidIdentifiable
)无法调用。
此特征的效用是在创建新模型时为主键生成uuid
。
现在,当我想创建模型时,当Eloquent插入值时,数据库会返回错误,因为我的模型的Id
为空。
因此,覆盖模型上的Boot
应该覆盖特征的Boot
但是如何获得我的特征和模型的自定义Boot
方法的功能?
<!-- language: php -->
class Box extends Model
{
use UuidIdentifiable;
protected $fillable = ['label', 'parent_box_id', 'user_id'];
protected $guarded = [];
public $incrementing = false;
public function owner() {
return $this->belongsTo('App\User', 'user_id');
}
public function parent() {
return $this->belongsTo('App\Box', 'parent_box_id');
}
public function boxes (){
return $this->hasMany('App\box', 'parent_box_id', 'id');
}
protected static function boot() {
parent::boot();
static::deleting(function(Box $box) {
$box->boxes()->delete();
});
}
}
class User extends Authenticatable
{
use Notifiable, UuidIdentifiable;
public $incrementing = false;
protected $fillable = ['username', 'email', 'password'];
protected $hidden = ['password', 'remember_token'];
public function boxes (){
return $this->hasMany('App\box', 'user_id', 'id');
}
protected static function boot() {
parent::boot();
static::deleting(function(User $user) {
$user->boxes()->delete();
});
}
}
trait UuidIdentifiable
{
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->{$model->getKeyName()} = Uuid::generate()->string;
});
}
}
答案 0 :(得分:0)
只是使用这个技巧:
trait UuidIdentifiable
{
protected static function bootUuidIdentifiable()
{
static::creating(function ($model) {
$model->{$model->getKeyName()} = Uuid::generate()->string;
});
}
}
所以,如果您将boot
更改为bootYourTraitName
并删除parent::boot();
我认为你的问题会解决