2015-04-03 46 views
2

我在我的模型中有一個published_at字段,我將其設置爲碳日期。Laravel雄辯骯髒檢查碳日期

class Model { 

    protected $dates = ['published_at']; 

    .... 

    public function setPublishedAtAttribute($val) 
    { 
     $this->attributes['published_at'] = \Carbon\Carbon::createFromTimeStamp(strtotime($val)); 
    } 
} 

這是用戶可以設置的一個域。當我運行就可以了dirty檢查:

$article->fill($data); 
echo $article->isDirty() ? 'true' : 'false'; 

它總是出現dirty。我做錯了什麼或者是因爲它試圖比較兩個碳對象?

+0

不相關的問題,但你可以用'碳::解析($ VAL)'代替'Carbon :: createFromTimeStamp'(strtotime($ val))' – lukasgeiter 2015-04-03 12:56:35

+4

如果屬性名稱在'$ dates'屬性中,你不需要創建一個mutator方法,Laravel會自動將它轉換爲'Carbon'實例。 – 2015-04-03 13:02:54

+3

我認爲馬丁斯的觀察可能是它很髒的原因。 $ dates數組中的所有屬性都會自動轉換爲Carbon,所以在實例化這個模型和手動設置之間可能會延遲* Attrbitue會導致它被標記爲髒? – dotty 2015-04-03 13:38:17

回答

0

最後處理這個問題的最好方法就是在mysql格式中正確格式化日期,然後讓Laravel處理其餘部分。

所以輸入日期前:

$data['published_at'] = '2015-03-03'; // format here; 

硬編碼在setPublishedAtAttribute方法日期字符串它似乎總是觸發髒標誌true即使當。

2

現在通過Laravel 5.5修復。

給大家使用的是舊版本Laravel:

只是簡單地覆蓋你的getDirty()方法是這樣的:

public function getDirty() 
{ 
    $dirty = parent::getDirty(); 

    foreach ($dirty as $key => $value) { 
     if (!array_key_exists($key, $this->original)) { 
      continue; 
     } 

     // unset any non-changed date values 
     if ($this->isDateAttribute($key)) { 
      $old = new Carbon($this->original[$key]); 
      $new = new Carbon($value); 

      if ($old->eq($new)) { 
       unset($dirty[$key]); 
      } 
     } 
    } 

    return $dirty; 
}