Php Laravel-模拟过程,但不修改原始模型

Php Laravel-模拟过程,但不修改原始模型,php,laravel,eloquent,laravel-5,Php,Laravel,Eloquent,Laravel 5,我需要以某种方式隔离一个作用域或一个类,以避免修改雄辩的模型(如果没有其他说明): 我有很多账户和服务。每个帐户都有一系列关系(规则和限制),这些关系有助于确定它可以用来支付什么以及如何支付 我现在需要做的是模拟购买一系列服务或服务组合。 因此,如果我有X个帐户和Y个服务,那么对于每次模拟,要再次查询/刷新关系,我必须发出太多请求,因此这不是一个选项 new Purchase($accounts, $services); new Purchase($accounts, $otherServic

我需要以某种方式隔离一个作用域或一个类,以避免修改雄辩的模型(如果没有其他说明):

我有很多账户和服务。每个帐户都有一系列关系(规则和限制),这些关系有助于确定它可以用来支付什么以及如何支付

我现在需要做的是模拟购买一系列服务或服务组合。

  • 因此,如果我有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()
    将所有内容转换为数组,然后使用它们。但是我失去了使用所有模型函数的选项

    此外,我还知道雄辩的模型
    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();
                }
            }
        }
    }