Покращення діагностики помилок бази даних за допомогою getRawSql у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 15 квітня, 2025
Відтепер виправлення помилок у базі даних у Laravel стало легшим завдяки методу getRawSql, доступному в класі QueryException. Дізнайтеся, як цей новий функціонал спрощує налагодження SQL запитів і підвищує ефективність розробки в нашій статті!

Відтепер виправлення помилок у базі даних у Laravel стало простішим завдяки методу getRawSql, що доступний у класі QueryException. Ця функція надає повні SQL-запити з усіма прив’язками, зникає необхідність здогадуватися при пошуку проблем у базі даних.

Виправлення помилок бази даних завжди вимагало бачити точну SQL-команду, яка спричинила проблему. У попередніх версіях Laravel об'єкт QueryException надавав рядки запитів і прив’язки окремо, змушуючи розробників вручну відтворювати повний запит або використовувати недосконалі техніки заміни рядків.

Новий метод getRawSql спрощує цей процес:

try {
    // Операція з базою даних, яка може не вдасться
} catch (QueryException $e) {
    // Отримати повний SQL з усіма прив'язками
    $rawSql = $e->getRawSql();
 
    // Додати до журналу або відобразити для налагодження
    Log::error("Помилка бази даних: {$e->getMessage()} | Запит: {$rawSql}");
}

При інтеграції з сервісами моніторингу помилок цей метод є особливо цінним:

// У вашому обробнику винятків
$this->reportable(function (QueryException $e) {
    // Отримати повністю відформатований SQL з прив'язками
    $rawSql = $e->getRawSql();
 
    // Переслати дані до сервісу моніторингу
    ErrorReporter::capture([
        'message' => $e->getMessage(),
        'sql' => $rawSql,
        'connection' => $e->getConnection()->getName(),
        'code' => $e->getCode()
    ]);
});

Цей підхід можна розширити для створення спеціалізованих каналів журналювання SQL-помилок, що надає більше контексту для вирішення проблем у продуктивній частині.

Ви також можете інтегрувати це безпосередньо в систему обробки винятків Laravel:

// У класі App\Exceptions\Handler
public function register()
{
    $this->reportable(function (QueryException $e) {
        // Записати повний SQL-запит
        Log::channel('sql_errors')->error($e->getRawSql());
 
        return false;
    });
}

Окрім цього, підтримується новий синтаксис конфігурації винятків у Laravel:

->withExceptions(function (Exceptions $exceptions) {
    $exceptions->report(function (QueryException $e) {
        // Відправити до сервісу моніторингу
        MyErrorServiceFacade::report('Помилка виконання SQL: ', $e->getRawSql());
    });
})

Хоча зміни невеликі, метод getRawSql суттєво покращує роботу розробників, надаючи швидкий доступ до правильно відформатованих запитів, що допомагає швидше виявляти та усувати проблеми з базою даних