Laravel sử dụng PDO, vì vậy bạn có thể sử dụng errorInfo
biến trả về lỗi SQLSTATE và thông báo. Về cơ bản, bạn cần sử dụng $e->errorInfo;
Nếu bạn muốn đăng nhập tất cả các lỗi SQL vào cơ sở dữ liệu, bạn có thể sử dụng Trình xử lý ngoại lệ (app/Exceptions/Handler.php
và lắng nghe QueryExceptions
. Một cái gì đó như thế này:
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);
}
Sau đó, bạn có thể sử dụng một cái gì đó như sau:
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..
// ....
}