Laravel използва PDO, така че можете да използвате errorInfo
променлива, която връща грешката SQLSTATE и съобщението. По принцип трябва да използвате $e->errorInfo;
Ако искате да регистрирате всички SQL грешки в базата данни, можете да използвате манипулатора на изключения (app/Exceptions/Handler.php
и слушайте за QueryExceptions
. Нещо като това:
public function render($request, Exception $e)
{
switch ($e) {
case ($e instanceof \Illuminate\Database\QueryException):
LogTracker::saveSqlError($e);
break;
default:
LogTracker::saveError($e, $e->getCode());
}
return parent::render($request, $e);
}
След това можете да използвате нещо подобно:
public function saveSqlError($exception)
{
$sql = $exception->getSql();
$bindings = $exception->getBindings()
// Process the query's SQL and parameters and create the exact query
foreach ($bindings as $i => $binding) {
if ($binding instanceof \DateTime) {
$bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
} else {
if (is_string($binding)) {
$bindings[$i] = "'$binding'";
}
}
}
$query = str_replace(array('%', '?'), array('%%', '%s'), $sql);
$query = vsprintf($query, $bindings);
// Here's the part you need
$errorInfo = $exception->errorInfo;
$data = [
'sql' => $query,
'message' => isset($errorInfo[2]) ? $errorInfo[2] : '',
'sql_state' => $errorInfo[0],
'error_code' => $errorInfo[1]
];
// Now store the error into database, if you want..
// ....
}