Решение, которое является простым, развязанным и многоразовым, заключается в использовании модели Observer. Идея состоит в том, чтобы зафиксировать событие creating
и заполнить атрибут created_at
. Этот метод может использоваться любым количеством моделей без необходимости повторять код или использовать неофициальные трюки. Самое главное, он очень похож на внутреннюю механику класса Model, что позволяет избежать неожиданных ошибок.
1) Создание SetCreatedAt
наблюдателя в App\Observers
:
namespace App\Observers;
use Illuminate\Database\Eloquent\Model;
class SetCreatedAt
{
/**
* Sets created_at when creating the model.
*
* @param Model $model
* @return void
*/
public function creating(Model $model)
{
$model->setCreatedAt($model->freshTimestamp());
}
}
2) На App\Providers\AppServiceProvider
внутри метода boot
добавить следующую строку для каждой из моделей, которые вы хотите created_at
будут созданы для:
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// Replace OrderLog with your model
OrderLog::observe(SetCreatedAt::class);
}
3) На ваших моделях единственное, что вам нужно сделать, - отключить отметки времени:
// Disable timestamps on the model
public $timestamps = false;
Протестировано с Laravel 5.3, но оно должно работать и с предыдущими версиями.
Удачи вам!
Я думаю, что это один из лучших способов взломать временные метки модели Eloquent. Это работает для меня на Laravel 5.1. – TodStoychev
Pretty work! И сначала должен вызываться 'parent :: boot();'. –
Это отличный ответ для одной модели. Для развязанного и многоразового решения я создал Observer на основе этого подхода. Благодаря! С наблюдателем http://stackoverflow.com/a/42822380/2188595 –