2016-06-09 42 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