Laravel 5.5:未在Pivot上发生的事件

时间:2017-09-22 06:42:47

标签: php laravel eloquent

我最近从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]
]);

1 个答案:

答案 0 :(得分:1)

Laravel 5.5中的Pivot模型。在attach关系的模型上使用BelongsToMany方法时,不要触发事件。

为什么?

在创建Eloquent模型时,当您附加相关模型时,Laravel不使用通常的create路径,而是使用insert \Illuminate\Database\Query\Builder方法。与Eloquent模型的createupdatesavedelete方法不同,查询构建器方法不会触发任何事件。在枢轴关系上定义Pivot模型不会改变这一点。

如果您想要实现此类功能,您可能需要考虑使用Laravel Pivot包,已在其作者的评论中提及。