Как узнать, изменились ли значения модели laravel при сохранении обратного вызова
после этого ответа, я делаю модель save callbacks (аналогично рельсам) в Laravel так:
class LessonPlan extends Eloquent {
public function save(array $options = array())
{
// before save code
parent::save();
// after save code
}
}
Однако я вызываю save() в Page
, когда я сохраняю новую страницу или обновляю существующую. Как узнать, что именно в этой операции?
Я пробовал что-то вроде
public function save(array $options = array())
{
// before save code
$oldLesson = clone $this;
parent::save();
..
if ($this->isLessonStatusChanged($oldLesson)) {
..
}
}
private function isLessonStatusChanged($oldLesson) {
return $this->status != $oldLesson->status;
}
но это не хорошо.. поскольку $oldLesson уже будет иметь новые значения $lesson
то, что я закончил делать, просто переименовал URL-адрес, чтобы увидеть, если это запрос на обновление.. но у меня уже есть проблемы с ночным сном (мой ответ на самом деле не говорит мне, изменились ли какие-либо значения. b/c можно подать форму обновления без фактического изменения чего-либо).. есть ли более чистый способ сделать это?
Ответы
Ответ 1
Вы можете использовать метод isDirty()
, который возвращает bool
и getDirty()
, который возвращает array
с измененными значениями.
public function save(array $options = array())
{
$changed = $this->isDirty() ? $this->getDirty() : false;
// before save code
parent::save();
// Do stuff here
if($changed)
{
foreach($changed as $attr)
{
// My logic
}
}
}
Ответ 2
Вы пробовали Model::getDirty()
? Я сам не пробовал, но он возвращает атрибуты, которые были изменены с момента последней синхронизации. См. документы API.