In Laravel, you can print the SQL query generated by Eloquent or the Query Builder using a few different methods, depending on the situation.
 
                                        ✅ 1. Use toSql() Method (for getting SQL without executing)
$query = DB::table('users')->where('id', 1);
dd($query->toSql());Output:
select * from `users` where `id` = ?This will show the raw SQL with placeholders, not the actual values.
✅ 2. Use dd() or dump() After Adding ->get() or ->first()
$users = DB::table('users')->where('id', 1)->get();
dd($users);This executes the query and dumps the result. But doesn't show the SQL itself.
✅ 3. Enable Query Logging (to see actual queries with bindings)
DB::enableQueryLog();
// Run some queries...
$users = DB::table('users')->where('id', 1)->get();
// Show logged queries
dd(DB::getQueryLog());This shows full queries with bindings merged in.
✅ 4. Use DB::listen() for Logging Queries (e.g., in Service Providers)
In AppServiceProvider or anywhere during booting:
use Illuminate\Support\Facades\DB;
public function boot()
{
    DB::listen(function ($query) {
        logger($query->sql);
        logger($query->bindings);
        logger($query->time);
    });
}✅ 5. Print Eloquent Queries
$userQuery = User::where('email', 'test@example.com');
dd($userQuery->toSql());Or with bindings:
$query = User::where('email', 'test@example.com');
dd([$query->toSql(), $query->getBindings()]);6. Print fully interpolated SQL queries in Laravel
// Create custom helper function
function interpolateQuery($query, $bindings) {
    $pdo = DB::getPdo();
    foreach ($bindings as $i => $binding) {
        $bindings[$i] = $pdo->quote($binding);
    }
    return vsprintf(str_replace('?', '%s', $query), $bindings);
}
$query = DB::table('users')->where('id', 1);
$sql = interpolateQuery($query->toSql(), $query->getBindings());
dd($sql);Note:
- Be cautious with this method in production, as it exposes query details.
Summary
| Method | Use Case | Notes | 
|---|---|---|
| toSql() | See SQL with ?placeholders | No bindings | 
| getQueryLog() | Get full SQL with bindings | Use after enableQueryLog() | 
| DB::listen() | Log queries in real-time | Good for debugging | 
| ->get()or->first()+dd() | Get result | Doesn't show query | 
Happy Coding! 😊