Команда Laravel выпустила обновление Laravel 12.54.0. В релизе появилось несколько небольших, но полезных улучшений для работы с моделями, HTTP-клиентом, тестированием и очередями. Основное нововведение это метод Model::withoutRelation(), который позволяет гибко управлять загруженными связями Eloquent-моделей. Разберём основные изменения подробнее.
Новый метод Model::withoutRelation()
В Eloquent уже есть методы для работы с загруженными связями:
withoutRelations()удаляет все связи;unsetRelation()удаляет конкретную связь, но изменяет текущую модель.
Новый метод withoutRelation() закрывает промежуточный сценарий. Он создаёт копию модели, в которой удалены указанные связи, не изменяя исходный объект.
Пример использования:
// Удалить одну связь из копии модели
$lightweight = $post->withoutRelation('comments');
// Удалить несколько связей
$lightweight = $post->withoutRelation(['comments', 'tags']);
// Исходная модель остается без изменений
$post->relationLoaded('comments'); // trueТакой подход полезен в нескольких ситуациях:
при сериализации моделей;
при отправке моделей в очередь;
при работе с циклическими зависимостями;
когда нужно уменьшить размер payload.
Фактически это удобный способ сделать облегчённую версию модели.
Метод interval() для обработки временных интервалов
В трейте InteractsWithData появился новый метод interval(). Он позволяет преобразовывать входные данные запроса в объект CarbonInterval. Метод понимает несколько форматов.
ISO-8601 интервал
$request->interval('duration');Например:
P1DT2HЭто будет интерпретировано как 1 день и 2 часа.
Числовое значение + единица измерения
$request->interval('timeout', 'second'); // "90" → 90 секунд
$request->interval('cooldown', 'day'); // "7" → 7 днейИспользование enum из Carbon
$request->interval('delay', Unit::Minute);Это делает работу с временными интервалами в формах и API значительно удобнее.
Улучшение Response::dump() в HTTP-клиенте
Метод dump() в HTTP-клиенте Laravel теперь выводит больше контекста.
Раньше он показывал только тело ответа. Теперь дополнительно выводятся следующие данные:
HTTP-метод запроса
URL
статус ответа
Пример нового вывода:
POST https://api.stripe.com/v1/charges 422
{"error": {"message": "Invalid card"}}Это особенно удобно, если в коде выполняется несколько HTTP-запросов подряд.
Поддержка BinaryFileResponse в тестах
Теперь тестовый класс TestResponse умеет корректно работать с ответами типа BinaryFileResponse. Это значит, что можно проверять содержимое файлов, возвращаемых через:
response()->file()
response()->download()Пример теста:
$this->get('/download/report.pdf')
->assertOk()
->assertStreamedContent(file_get_contents('report.pdf'));Раньше такие проверки не работали, потому что тестовый ответ не мог прочитать файл.
Улучшение команды queue:monitor
Команда queue:monitor теперь показывает возраст самого старого задания в очереди прямо в стандартном текстовом выводе. Раньше эта информация была доступна только в JSON-формате, что делало её менее удобной для быстрой диагностики. Теперь можно сразу увидеть, если задания слишком долго висят в очереди.
Индекс для таблицы jobs
В таблицу jobs добавлен составной индекс, который ускоряет опрос очереди.
Это улучшение снижает нагрузку на базу данных и ускоряет выборку заданий, особенно в системах с большим количеством воркеров.
Поддержка PostgreSQL tsvector
В Schema Builder появился новый тип столбца tsvector для PostgreSQL. Этот тип используется для полнотекстового поиска, поэтому его появление упрощает настройку search-индексов прямо через миграции Laravel.
Поддержка расширений CommonMark для Markdown-писем
Laravel теперь позволяет подключать кастомные расширения CommonMark при рендеринге Markdown-шаблонов для email. Это даёт больше гибкости при создании сложных шаблонов писем.