У меня есть модель Eloquent. Всякий раз, когда он извлекается из базы данных, я хотел бы проверить, выполняется ли условие, и установить атрибут модели, если это так.
EDIT: Первоначально я думал, что restoring
событие будет правильным местом для размещения соответствующей логики, но, как указывает Тайлер Кромптон, restoring
до восстановления записи с мягким удалением.
У вас есть два допустимых варианта:
\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
между множеством и атрибутом