Laravel Service Container: Dependency Injection Made Easy
Comprendi il Service Container di Laravel e come sfruttare la Dependency Injection per codice più te...
Tecniche avanzate per ottimizzare le query Eloquent e migliorare le performance della tua applicazione Laravel.
Autore
Giovanni D'Ippolito
Pubblicato
03 November 2025
Tempo di lettura
2 minuti
Eloquent è potente e conveniente, ma può generare query inefficienti se non usato correttamente. Questo può portare a problemi di performance, specialmente con database di grandi dimensioni.
Uno dei problemi più comuni è il problema N+1:
<?php
// ❌ PROBLEMA N+1 - Genera molte query
$users = User::all();
foreach ($users as $user) {
echo $user->posts->count(); // Una query per ogni utente!
}
// ✅ SOLUZIONE - Una sola query aggiuntiva
$users = User::withCount('posts')->get();
foreach ($users as $user) {
echo $user->posts_count; // Nessuna query aggiuntiva
}
?>
Carica le relazioni in anticipo per ridurre il numero di query:
<?php
// ❌ Male - N+1 queries
$posts = Post::all();
foreach ($posts as $post) {
echo $post->user->name;
echo $post->category->name;
}
// ✅ Bene - Solo 3 queries totali
$posts = Post::with(['user', 'category'])->get();
foreach ($posts as $post) {
echo $post->user->name;
echo $post->category->name;
}
?>
Non caricare colonne che non ti servono:
<?php
// ❌ Carica tutte le colonne
$users = User::all();
// ✅ Carica solo le colonne necessarie
$users = User::select(['id', 'name', 'email'])->get();
// Con relazioni
$posts = Post::with(['user:id,name', 'category:id,name'])
->select(['id', 'title', 'user_id', 'category_id'])
->get();
?>
Quando lavori con molti record, usa il chunking per evitare problemi di memoria:
<?php
// ❌ Carica tutto in memoria
User::all()->each(function ($user) {
// Processa utente
});
// ✅ Processa a blocchi
User::chunk(100, function ($users) {
foreach ($users as $user) {
// Processa utente
}
});
// Ancora meglio - lazy collections
User::lazy()->each(function ($user) {
// Processa un utente alla volta
});
?>
Non dimenticare di aggiungere indici alle colonne usate frequentemente nelle query:
<?php
// Migration
Schema::table('posts', function (Blueprint $table) {
$table->index('user_id');
$table->index('category_id');
$table->index(['published', 'published_at']);
});
?>
Comprendi il Service Container di Laravel e come sfruttare la Dependency Injection per codice più te...
Impara a usare Jobs e Queues in Laravel per migliorare le performance e l'esperienza utente.
Impara il Test-Driven Development con Pest, il framework di testing moderno per PHP.
Iscriviti alla nostra newsletter per ricevere gli ultimi articoli e novità direttamente nella tua casella di posta.