2015-04-03 2 views
2

У меня есть поле published_at в моей модели, которую я настраиваю как дату углерода.Laravel Eloquent Dirty Checking Carbon Dates

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. Я делаю что-то неправильно или это потому, что он пытается сравнить два объекта Carbon?

+0

не связана с проблемой, но вы можете использовать 'Carbon :: синтаксический анализ ($ Вэл)' вместо из 'Carbon :: createFromTimeStamp (strtotime ($ val))' – lukasgeiter

+4

Вам не нужно создавать мутаторный метод, Laravel автоматически преобразует его в экземпляр 'Carbon', если имя атрибута находится в свойстве' $ dates'. –

+3

Я думаю, что наблюдение Мартинса, вероятно, является причиной того, что это грязно. Все атрибуты в массиве $ date автоматически преобразуются в Carbon, поэтому может быть задержка между созданием этой модели и ручным набором * Attrbitue, чтобы это было отмечено как грязное? – dotty

ответ

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; 
} 
Смежные вопросы