如果没有另外说明,我需要以某种方式隔离范围或类以不修改Eloquent模型:
我有很多帐户和服务。每个帐户都有一堆关系(规则和限制),这有助于确定它可用于支付的费用和方式。
我现在需要做的是模拟购买一堆服务或服务组合。
因此,如果我有X帐户和Y服务,那么每次模拟再次查询/刷新关系时,我将不得不提出太多请求,因此不能选择。
new Purchase($accounts, $services);
new Purchase($accounts, $otherServices);
...
接下来的逻辑步骤是加载所有关系,然后模拟购买过程。除非我完成模拟或第一次服务,然后下次购买时所有值都已更改。
以下是我的问题的简化版本:
function doSomething($user)
{
$user->doneSomething = true;
}
$user = Auth::user();
$user->doneSomething = false;
doSomething($user);
dd($user->doneSomething); // true -- But this one time I want it to be false
好的,我必须在我的功能后重置模型。如果我使用了来自数据库的所有规则,这可能会更容易。
$account->setRawAttributes($account->getOriginal())
但是现在我也想使用相同的函数来模拟我在函数之前修改帐户和规则的一些情况。
我还考虑过使用getAtributes()
getRelations()
将所有内容转换为数组,然后再使用它们。但后来我失去了使用所有模型函数的选项。
我也知道Eloquent Model replicate()
功能。但这看起来很麻烦,最终我还需要在计算和更新的行上调用save;
最后再次说明问题我需要在函数周围添加一个大的泡泡/隔离范围,这样无论Eloquent模型作为参数传入都将保持不变。
// Purchse.php
public function calculate()
{
foreach($this->services as &$service)
foreach($this->accounts as &$account)
...
}
// Calling the purchase:
isolateEverything(function () {
$purchase = new Purchase($accounts, $services);
$result = $purchase->calculate();
});
一种方法是在计算功能之前存储和替换。但似乎有很多无用的代码。
另一种方法是以某种方式将功能与外界隔离开来。
实现所有这些目标的最佳途径是什么?