QueryException (SQL Errors)
A database query failed due to invalid SQL, constraint violations, or connection issues.
Explanation
QueryException is thrown by Laravel's database layer when a SQL query fails. This can happen for many reasons including syntax errors in raw queries, foreign key constraint violations, unique constraint violations, or database connection issues. The exception message includes the raw SQL query that failed, making it easier to debug. Common scenarios include inserting duplicate values into unique columns, referencing non-existent foreign keys, or using database-specific syntax that your database driver doesn't support.
Common Causes
- Unique constraint violation
- Foreign key constraint failure
- Invalid SQL syntax
- Database connection lost
- Column type mismatch
Solution
Read the QueryException message carefully to identify which SQL query failed and why. Use DB::enableQueryLog() and dd(DB::getQueryLog()) to inspect queries during development. For constraint violations, ensure referenced records exist before inserting or updating. Use database transactions for operations that involve multiple related queries. Add proper database indexes for frequently queried columns. Test raw SQL queries directly in your database client to verify they work.
Code Example
// This can throw QueryException if email already exists
User::create(['email' => 'existing@example.com', 'name' => 'John']);
// Fix: Use findOrCreate for idempotent operations
$user = User::firstOrCreate(
['email' => 'existing@example.com'],
['name' => 'John']
);
// For raw queries with error handling
try {
DB::insert('INSERT INTO users (email, name) VALUES (?, ?)',
['test@example.com', 'Test']);
} catch (QueryException $e) {
if ($e->errorInfo[1] == 1062) {
// Duplicate entry
return response()->json(['error' => 'Email already exists'], 422);
}
throw $e;
}
Error Information
Language
php
Framework
laravel
Difficulty
Intermediate
Views
318
Related Errors
403
Laravel
AuthorizationException (403)
The authenticated user lacks permission to perform the requested action.
Database
Lock Wait Timeout Exceeded
A database query waited too long for a lock held by another transaction.
PHP
Type Error: Return Type Must Be Compatible
A method override has a return type that conflicts with the parent class or interface.
401
Laravel
AuthenticationException (401)
The user is not authenticated and cannot access the requested resource.