2016-06-09 29 views
0

在我的几个型号我有这样重用的存取和存取器

public function setTotalAttribute($value) 
{ 
    return $this->attributes['total'] = $value * 100; 
} 

public function getTotalAttribute($value) 
{ 
    return $value * 0.01; 
} 

有时候,我变异被称为购买或价格领域,但代码代码是相同的(改变7.99至799存储在数据库中,并在返回时将其更改)。

如果所有的字段都被命名为相同的,我可以使用特征,但是它们稍有不同....有没有一种方法可以设置类似于自动变异为Carbon实例的日期字段?

+0

你可以使用'traits'(PHP> = 5.5)。或者也许是'抽象'类。 – DanFromGermany

+0

@DanFromGermany我提到我不能使用性状,因为不同的模型的字段的名称是不同的..除非我失去了一些东西.. – Wizzard

回答

0

一个解决方案是定义在具有此类字段的模型中处理美元/美分转换的字段,然后使用特征来覆盖全局增变器/存取器。

class Model 
{ 
    use HasMoneyFields; 

    protected $moneyFields = ['purchase', 'price', 'total']; 
} 

trait HasMoneyFields 
{   
    public function getAttributeValue($key) 
    { 
     $value = parent::getAttributeValue($key); 

     if (property_exists($this, 'moneyFields')) { 
      if (in_array($key, $this->moneyFields)) { 
       $value /= 100; 
      } 
     } 

     return $value; 
    } 

    public function setAttribute($key, $value) 
    { 
     parent::setAttribute($key, $value); 

     if (property_exists($this, 'moneyFields')) { 
      if (in_array($key, $this->moneyFields)) { 
       $this->attributes[$key] = $value * 100; 
      } 
     } 
    } 
} 
+0

这看起来很有前途!请注意,我使用$ value * 0.01而不是除法,所以我不必检查0(除以零)并处理它。谢谢! – Wizzard

+0

一个缺点是,魔法调用很昂贵,PHP无法优化代码,并且它会比正确的方法定义慢。 – DanFromGermany

+0

另一个缺点是你只能做一次。对Money进行此操作,然后再为其他操作执行此操作将失败,因为不能在同时使用的两种不同特征中使用相同的函数名称。 – Wizzard