Поддержите проект сделав пожертвование.
Inn_100_gramm

Если вы видите это, значит, я еще не придумал, что написать.

Маршрутизация моделей в Laravel: автоматическое извлечение моделей по идентификатору

Одной из мощных возможностей Laravel является функционал под названием “Маршрутизация моделей” (Route Model Binding). Этот функционал позволяет автоматически извлекать модель из базы данных по ее первичному ключу, переданному в маршруте. Это упрощает код и улучшает читаемость и поддерживаемость приложения.

Пример использования

Рассмотрим пример, в котором мы хотим создать маршрут для отображения информации о курсе. Мы будем использовать контроллер для обработки запроса и извлечения данных модели Course.

Маршрут

Для начала определим маршрут в файле маршрутов:

Route::get('{course}', [CourseController::class, 'show'])->name('show');

Контроллер

Теперь создадим метод show в контроллере CourseController, который будет обрабатывать запросы к этому маршруту:

namespace App\Http\Controllers;

use App\Models\Course;
use App\Http\Resources\ShowResource;
use App\Handlers\ShowHandler;
use Illuminate\Http\JsonResponse;

class CourseController extends Controller
{
    public function show(Course $course, ShowHandler $handler): JsonResponse
    {
        $data = $handler->handle($course);

        return $this->response(new ShowResource($data));
    }
}

Как это работает

Когда маршрут вызывается с идентификатором модели, например /course/1, Laravel автоматически выполняет запрос к базе данных, чтобы найти модель Course с id, равным 1. Найденная модель будет передана в метод контроллера как параметр $course.

Внутри метода show мы можем использовать объект модели Course, так как он уже автоматически загружен Laravel. Далее, мы обрабатываем данные с помощью ShowHandler и возвращаем результат в виде JSON-ответа, используя ресурс ShowResource.

Обработка отсутствующих моделей

Если модель с указанным идентификатором не найдена, Laravel автоматически вернет страницу ошибки 404. Это происходит благодаря встроенной в Laravel обработке исключений.

Пользовательские ключи

В некоторых случаях может понадобиться использовать другой ключ вместо id. Например, если вы хотите извлекать модель по полю slug, вы можете настроить это в модели Course.

Пример с пользовательским ключом

// В модели Course
public function getRouteKeyName()
{
    return 'slug';
}

После добавления этого метода, Laravel будет использовать поле slug для поиска модели вместо id. Теперь маршрут /course/some-slug будет искать курс с slug, равным some-slug.

Преимущества маршрутизации моделей

  1. Упрощение кода: Нет необходимости вручную извлекать модель из базы данных, это делает код контроллера чище и понятнее.
  2. Повышение безопасности: Автоматическая обработка отсутствующих моделей и возвращение ошибки 404 предотвращает возникновение ошибок.
  3. Гибкость: Возможность использования пользовательских ключей для извлечения моделей.

Заключение

Маршрутизация моделей в Laravel — это мощный инструмент, который упрощает работу с моделями в приложении. Автоматическое извлечение моделей по идентификатору, улучшенная читаемость кода и встроенная обработка ошибок делают этот функционал незаменимым для разработчиков.

Использование маршрутизации моделей позволяет сосредоточиться на бизнес-логике приложения, не беспокоясь о рутинных задачах, таких как извлечение данных из базы. Попробуйте использовать этот функционал в вашем следующем проекте, и вы ощутите все его преимущества.

2
Inn_100_gramm

Если вы видите это, значит, я еще не придумал, что написать.

Обработка зависших запросов в PostgreSQL

При работе с PostgreSQL иногда возникает необходимость управлять зависшими запросами, которые могут блокировать миграции или другие важные процессы. В данной статье мы рассмотрим, как проверить активные процессы и блокировки, а также как принудительно завершать зависшие транзакции.

Проверка активных процессов и блокировок Первым шагом для диагностики проблем в базе данных является проверка активных процессов и блокировок. Для этого можно использовать следующий SQL-запрос:

SELECT pid, age(clock_timestamp(), query_start) AS duration, usename, query 
FROM pg_stat_activity 
WHERE state != 'idle' 
  AND pid != pg_backend_pid();

Этот запрос вернет информацию о текущих активных процессах, включая их идентификатор процесса (PID), продолжительность выполнения запроса, имя пользователя и сам запрос. Таким образом, можно определить, какие запросы выполняются слишком долго или блокируют другие процессы.

Принудительное завершение зависшей транзакции Если вы обнаружили процесс, который блокирует другие операции, его можно завершить принудительно. Для этого используйте следующий SQL-запрос:

SELECT pg_terminate_backend(pid);

Замените pid на идентификатор процесса, который необходимо завершить. Этот запрос завершит выбранный процесс и освободит ресурсы, которые он занимал.

Завершение всех зависших процессов Если необходимо завершить все зависшие процессы, кроме текущей сессии, можно использовать следующий запрос. Он завершит все процессы, которые находятся в состоянии, отличном от idle, и выполняются более 10 минут:

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state != 'idle'
  AND pid != pg_backend_pid()
  AND query_start < NOW() - INTERVAL '10 minutes';

Этот запрос позволяет автоматизировать процесс очистки зависших запросов, что может быть особенно полезно при выполнении длительных операций или миграций.

Заключение Управление зависшими запросами в PostgreSQL — важная задача для обеспечения стабильной и эффективной работы базы данных. С помощью приведенных выше SQL-запросов можно диагностировать и устранять проблемы, связанные с зависшими процессами, что поможет поддерживать высокую производительность и надежность системы.

0