Php Laravel-模拟过程,但不修改原始模型
我需要以某种方式隔离一个作用域或一个类,以避免修改雄辩的模型(如果没有其他说明): 我有很多账户和服务。每个帐户都有一系列关系(规则和限制),这些关系有助于确定它可以用来支付什么以及如何支付 我现在需要做的是模拟购买一系列服务或服务组合。Php Laravel-模拟过程,但不修改原始模型,php,laravel,eloquent,laravel-5,Php,Laravel,Eloquent,Laravel 5,我需要以某种方式隔离一个作用域或一个类,以避免修改雄辩的模型(如果没有其他说明): 我有很多账户和服务。每个帐户都有一系列关系(规则和限制),这些关系有助于确定它可以用来支付什么以及如何支付 我现在需要做的是模拟购买一系列服务或服务组合。 因此,如果我有X个帐户和Y个服务,那么对于每次模拟,要再次查询/刷新关系,我必须发出太多请求,因此这不是一个选项 new Purchase($accounts, $services); new Purchase($accounts, $otherServic
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()
将所有内容转换为数组,然后使用它们。但是我失去了使用所有模型函数的选项
此外,我还知道雄辩的模型replicate()
函数。但这似乎很麻烦,最终我还需要对计算和更新的行调用save
最后,为了再次说明这个问题,我需要在函数周围添加一个大气泡/隔离范围,这样无论作为参数传入什么雄辩的模型都将保持不变
// 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();
});
一种方法是在计算函数之前进行存储和替换。但似乎有很多无用的代码
另一种可能是以某种方式将功能与外部世界隔离开来
实现这一切的最佳方法是什么?我想我已经找到了一些神奇的方法,可以帮助我。它们仍有待全面测试,但我的第一个简单实验表明,这可能有效
我想我可以将这些值存储为原始值
public function syncOriginal()
{
$this->original = $this->attributes;
return $this;
}
然后在我完成计算并需要重置后,我可以与
如果我不想更改原始属性,我可以创建类似的方法,如syncBackup()
和getBackup()
似乎最终我所需要的只是找到一个正常的地方来存储备份值
当你寻找一个解决方案的时间太长,以至于最终你提出了一个问题,然后很快你就找到了一个解决方案
编辑:这是我目前制作的,似乎对我有用
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
class BaseModel extends Model {
private $backup = array();
public function createBackup()
{
$this->backup = $this->attributes;
foreach ($this->getRelations() as $relation => $value)
{
if($value instanceof self)
{
$value->createBackup();
}
}
}
public function popBackup()
{
$this->setRawAttributes($this->backup);
foreach ($this->getRelations() as $relation => $value)
{
if($value instanceof self)
{
$value->popBackup();
}
}
}
}
从这里还可以创建备份阵列,并在需要时开始逐个弹出备份。这也可能是一种特质
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
class BaseModel extends Model {
private $backup = array();
public function createBackup()
{
$this->backup = $this->attributes;
foreach ($this->getRelations() as $relation => $value)
{
if($value instanceof self)
{
$value->createBackup();
}
}
}
public function popBackup()
{
$this->setRawAttributes($this->backup);
foreach ($this->getRelations() as $relation => $value)
{
if($value instanceof self)
{
$value->popBackup();
}
}
}
}