Laravel 自定义模型的 create() 方法
Laravel customize create() method on model
我正在尝试在模型上扩展 create()
方法,这样每次调用 create()
时它都会在插入行之前做一些事情。
例如我有一个 Balance
模型,它有字段 amount
和 ending_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();
我正在尝试在模型上扩展 create()
方法,这样每次调用 create()
时它都会在插入行之前做一些事情。
例如我有一个 Balance
模型,它有字段 amount
和 ending_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();