我最近从L5.3迁移到L5.5,并将新的透视类添加到名为ShopProductPivot的Shop模型中,并监控事件,我将事件添加到" Shop"和" ShopProductPivot" (为简单起见,省略了细节):
class Shop extends Model{
protected $table = 'shops';
protected $fillable = array('user_id', 'title');
public function productSKUs(){
return $this->belongsToMany('App\ProductSKU',
'shop_products', 'shop_id', 'sku_id')
->withPivot(['price', 'discount', 'transport_price', 'in_stock'])
->using('App\ShopProductPivot');
}
public static function boot(){
parent::boot();
Pivot::creating(function($pivot) {
dump("pivot_creating");
});
Pivot::created(function($pivot) {
dump("pivot_created");
});
Pivot::saving(function($pivot) {
dump("pivot_saving");
});
Pivot::saved(function($pivot) {
dump("pivot_saved");
});
Pivot::updating(function($pivot) {
dump("pivot_updating");
});
Pivot::updated(function($pivot) {
dump("pivot_updated");
});
}
}
class ShopProductPivot extends Pivot
{
protected $table = 'shop_products';
protected $fillable = array('shop_id', 'sku_id', 'price', 'in_stock');
public static function boot(){
parent::boot();
static::creating(function($pivot) {
dump("creating");
});
static::created(function($pivot) {
dump("created");
});
static::saving(function($pivot) {
dump("saving");
});
static::saved(function($pivot) {
dump("saved");
});
static::updating(function($pivot) {
dump("updating");
});
static::updated(function($pivot) {
dump("updated");
});
}
}
通过运行以下命令,我希望发生一些事件,但没有任何事情发生在我身上!
$shop->productSKUs()->attach([
101 => ['price'=> mt_rand(10,99)*10, 'in_stock'=> true],
102 => ['price'=> mt_rand(10,99)*10, 'in_stock'=> true]
]);
答案 0 :(得分:1)
Laravel 5.5中的Pivot模型。在attach
关系的模型上使用BelongsToMany
方法时,不要触发事件。
为什么?
在创建Eloquent模型时,当您附加相关模型时,Laravel不使用通常的create
路径,而是使用insert
\Illuminate\Database\Query\Builder
方法。与Eloquent模型的create
,update
,save
和delete
方法不同,查询构建器方法不会触发任何事件。在枢轴关系上定义Pivot模型不会改变这一点。
如果您想要实现此类功能,您可能需要考虑使用Laravel Pivot包,已在其作者的评论中提及。