РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
333 of 1392 menu

Событие saved

Событие saved в Laravel срабатывает после того, как модель была успешно сохранена в базу данных. Это событие вызывается как при создании новой записи, так и при обновлении существующей. Оно является частью системы событий Eloquent и позволяет выполнять дополнительные действия после сохранения модели.

Событие saved отличается от saving тем, что первое срабатывает после сохранения, а второе - до. Это важно учитывать при планировании логики приложения, так как в обработчике saved вы уже можете быть уверены, что данные записаны в базу.

Регистрация обработчика

Обработчик события saved можно зарегистрировать в методе boot модели:

<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Article extends Model { protected static function boot() { parent::boot(); static::saved(function ($model) { // Логика после сохранения }); } } ?>

Также можно использовать классы слушателей или зарегистрировать событие в EventServiceProvider:

<?php namespace App\Providers; use App\Models\Article; use App\Listeners\LogArticleSaved; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { protected $listen = [ \Illuminate\Database\Eloquent\Events\Saved::class => [ LogArticleSaved::class, ], ]; } ?>

Синтаксис

Событие saved применяется к модели и вызывается автоматически. В обработчик передаётся экземпляр модели, к которому можно обращаться через параметр замыкания:

<?php static::saved(function ($model) { // $model - сохранённая модель $model->field; // Доступ к полям }); ?>

Пример

Давайте создадим логирование после сохранения статьи:

<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Log; class Article extends Model { protected static function boot() { parent::boot(); static::saved(function ($model) { Log::info('Article saved', [ 'id' => $model->id, 'title' => $model->title, ]); }); } } ?>

Теперь при сохранении статьи в лог будет записываться информация:

<?php use App\Models\Article; Route::get('/save-article', function () { $article = new Article(); $article->title = 'New Article'; $article->text = 'This is a new article'; $article->save(); echo "Article saved successfully"; }); ?>

Результат выполнения кода (лог-файл):

"[2026-09-07 12:00:00] local.INFO: Article saved {\"id\":1,\"title\":\"New Article\"}"

Пример

Давайте отправим уведомление после обновления модели:

<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Mail; use App\Mail\UserUpdated; class User extends Model { protected static function boot() { parent::boot(); static::saved(function ($user) { if ($user->wasChanged()) { Mail::to($user->email)->send(new UserUpdated($user)); } }); } } ?>

В этом примере письмо отправляется только если были изменены какие-либо поля модели:

<?php use App\Models\User; Route::post('/update-user/{id}', function ($id) { $user = User::find($id); $user->name = 'John Doe'; $user->save(); echo "User updated successfully"; }); ?>

Пример

Давайте используем событие для обновления связанных данных:

<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Order extends Model { protected static function boot() { parent::boot(); static::saved(function ($order) { // Обновляем общую сумму заказа $total = $order->items()->sum('price'); $order->total = $total; $order->saveQuietly(); // Сохраняем без запуска событий }); } public function items() { return $this->hasMany(OrderItem::class); } } ?>

При сохранении заказа автоматически пересчитывается общая сумма:

<?php use App\Models\Order; use App\Models\OrderItem; Route::post('/create-order', function () { $order = new Order(); $order->customer_name = 'John'; $order->save(); $item = new OrderItem(); $item->order_id = $order->id; $item->price = 100; $item->save(); // После сохранения товара событие saved // пересчитает общую сумму заказа echo "Order created with total: " . $order->refresh()->total; }); ?>

Результат выполнения кода:

"Order created with total: 100"

Смотрите также

  • событие saving,
    которое срабатывает перед сохранением модели
  • событие created,
    которое срабатывает после создания записи
  • событие updated,
    которое срабатывает после обновления записи
  • метод saveQuietly,
    который сохраняет модель без запуска событий
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить