Le query builder de Laravel construit et exécute les requêtes SQL via une interface fluent. Point de départ : DB::table(), suivi d’un chaînage de méthodes.
use Illuminate\Support\Facades\DB;$users = DB::table('users')->get();
En interne, les paramètres sont liés via PDO, ce qui prévient automatiquement les injections SQL.
Le query builder fonctionne avec toutes les bases prises en charge par Laravel (MySQL, MariaDB, PostgreSQL, SQLite, SQL Server). Le code reste identique quand vous changez de base.
// Premier résultat (null si absent)$user = DB::table('users')->where('name', 'Taro Yamada')->first();// Exception si absent (404 automatique)$user = DB::table('users')->where('name', 'Taro Yamada')->firstOrFail();// Une seule colonne$email = DB::table('users')->where('name', 'Taro Yamada')->value('email');// Par ID$user = DB::table('users')->find(3);
// Collection des valeurs de la colonne email$emails = DB::table('users')->pluck('email');// Tableau associatif name → email$emailByName = DB::table('users')->pluck('email', 'name');
use Illuminate\Support\Collection;// 100 par 100DB::table('users')->orderBy('id')->chunk(100, function (Collection $users) { foreach ($users as $user) { // ... }});// Utiliser chunkById quand on met à jour pendant l'itérationDB::table('users')->where('active', false) ->chunkById(100, function (Collection $users) { foreach ($users as $user) { DB::table('users') ->where('id', $user->id) ->update(['active' => true]); } });
Utilisez chunkById() (pas chunk()) si vous modifiez/supprimez des enregistrements pendant l’itération, pour éviter les décalages.
use Illuminate\Database\Query\Builder;$users = DB::table('users') ->where('active', true) ->where(function (Builder $query) { $query->where('role', 'admin') ->orWhere('role', 'moderator'); }) ->get();// WHERE active = 1 AND (role = 'admin' OR role = 'moderator')
// Insensible à la casse par défaut$users = DB::table('users') ->whereLike('name', '%Yamada%') ->get();// Sensible à la casse$users = DB::table('users') ->whereLike('name', '%Yamada%', caseSensitive: true) ->get();
whereNullSafeEquals traite NULL = NULL comme vrai (contrairement à = classique). Équivalent à <=> sous MySQL, IS NOT DISTINCT FROM sous PostgreSQL.
$lastLoginIp = $request->input('last_login_ip');// Fonctionne même si $lastLoginIp est null$users = DB::table('users') ->whereNullSafeEquals('last_login_ip', $lastLoginIp) ->get();
where('column', null) devient WHERE column IS NULL. whereNullSafeEquals reste cohérent quelle que soit la valeur bindée.
Le Query Builder est plus bas niveau et retourne stdClass, non des instances de modèle.
Sans besoin de relations ou d’événements (observers), il est plus simple et plus rapide.