Выполнить код, когда модель Eloquent извлекается из базы данных

У меня есть модель Eloquent. Всякий раз, когда он извлекается из базы данных, я хотел бы проверить, выполняется ли условие, и установить атрибут модели, если это так.

EDIT: Первоначально я думал, что restoring событие будет правильным местом для размещения соответствующей логики, но, как указывает Тайлер Кромптон, restoring до восстановления записи с мягким удалением.

Related of "Выполнить код, когда модель Eloquent извлекается из базы данных"

У вас есть два допустимых варианта:

  • Вы можете подклассифицировать \Illuminate\Datebase\Eloquent\Model чтобы добавить такое событие.
  • Вы можете изменить свою копию \Illuminate\Datebase\Eloquent\Model чтобы добавить это (и, возможно, отправить запрос на незапрашиваемый запрос в Laravel на GitHub ). Согласно выпуску 1685 , похоже, что они этого не хотят.

Если бы я был вами, я бы выбрал первый вариант, и я бы это сделал:

 <?php namespace \Illuminate\Database\Eloquent; abstract class LoadingModel extends Model { /** * Register a loaded model event with the dispatcher. * * @param \Closure|string $callback * @return void */ public static function loaded($callback) { static::registerModelEvent('loaded', $callback); } /** * Get the observable event names. * * @return array */ public function getObservableEvents() { return array_merge(parent::getObservableEvents(), array('loaded')); } /** * Create a new model instance that is existing. * * @param array $attributes * @return \Illuminate\Database\Eloquent\Model|static */ public function newFromBuilder($attributes = array()) { $instance = parent::newFromBuilder($attributes); $instance->fireModelEvent('loaded', false); return $instance; } } 

Просто убедитесь, что подклассы моделей, о которых идет речь, LoadingModule с LoadingModule . Я подтвердил, что это работает, поскольку я нашел для него большой вариант использования. Старые версии PHP возвращали значения MySQL как строки. Как правило, PHP будет молча приводить их к своим числовым типам в числовых операциях. Однако преобразование в JSON не считается числовой операцией. Значения JSON представлены в виде строк. Это может вызвать проблемы для клиентов моего API. Поэтому я добавил loaded события в мои модели для преобразования значений в правильный тип.

Вы могли бы сделать это по пути или выход. Похоже, вы хотели, чтобы он хранился в базе данных, поэтому вы можете использовать мутаторы.

 class Foo extends Eloquent { public function setBAttribute($value) { if ($this->attributes['a'] == $this->attributes['b']) { $this->attributes['b'] = 1; } } } 

Когда будет установлен B , он будет проверять A и хранить 1 в B

Замечание: обратите внимание на B между множеством и атрибутом