Laravel 自定义模型的 create() 方法

Laravel customize create() method on model

我正在尝试在模型上扩展 create() 方法,这样每次调用 create() 时它都会在插入行之前做一些事情。

例如我有一个 Balance 模型,它有字段 amountending_balance。我希望能够仅在 create() 时指定 amount,然后在模型中自动计算 ending_balance(即通过查找之前的 ending_balance

我还希望能够将所有创建逻辑放在一个 DB::transaction() 中,这样我就可以在进行计算时锁定行。

我已经将它添加到我的模型中,但它在创建时从未命中 dd()。

class Balance extends Model
{
    use HasFactory;

    public static function create(array $attributes = [])
    {
        dd($attributes);
        // Calculate the ending_balance here 

        return parent::create($attributes);
    }
}

您可能想要使用模型事件。

这个 link 描述了如何使用闭包来做到这一点: https://laravel.com/docs/8.x/eloquent#events-using-closures

“created/creating”活动可能就是您要找的。如果需要重新计算,请查看 updating/updated 事件。

 class Balance extends Model
    {
        protected static function booted()
        {
            static::created(function ($user) {
                // Calculate the fields value here
            });
        }
    }

我个人认为覆盖 create 方法有点奇怪,而且我从未见过有人这样做。对于您的队友来说,这可能也不明显。只关注事件。

另一个问题是 - 如何在交易中做事。答案:使用 Laravel DB facade 到 运行 事务中的代码:

https://laravel.com/docs/8.x/database#database-transactions

DB::transaction(function () {
    Balance::create([...]);
    OtherMode::create([...]);
});

这将在闭包的最后一行之后提交事务。

您也可以手动控制交易:

DB::beginTransaction();
DB::rollBack();
DB::commit();