Salta al contenuto principale
Laravel

Laravel Eloquent: Query Optimization per Performance Migliori

Tecniche avanzate per ottimizzare le query Eloquent e migliorare le performance della tua applicazione Laravel.

Giovanni D'Ippolito
2 min di lettura
Autore
Giovanni D'Ippolito
Pubblicato
03 November 2025
Lettura
2 minuti
Tags
#Laravel #Eloquent #Performance #Optimization

Perché Ottimizzare le Query Eloquent?

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.

Il Problema N+1

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
}
?>
Il problema N+1 può rallentare drasticamente la tua applicazione. Usa sempre Eager Loading quando accedi alle relazioni!

Eager Loading

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;
}
?>

Select Solo i Campi Necessari

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();
?>

Chunking per Grandi Dataset

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
});
?>
Usando queste tecniche, puoi migliorare le performance della tua applicazione fino al 90%!

Indici Database

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']);
});
?>

Articoli Correlati

Laravel

Laravel Service Container: Dependency Injection Made Easy

Comprendi il Service Container di Laravel e come sfruttare la Dependency Injection per cod...

11 Nov 2025 Leggi
Laravel

Laravel Jobs e Queues: Guida Completa all'Elaborazione Asincrona

Impara a usare Jobs e Queues in Laravel per migliorare le performance e l'esperienza utent...

19 Nov 2025 Leggi
Laravel

Laravel Testing: TDD con Pest PHP

Impara il Test-Driven Development con Pest, il framework di testing moderno per PHP.

27 Nov 2025 Leggi

Rimani Aggiornato

Iscriviti alla nostra newsletter per ricevere gli ultimi articoli direttamente nella tua casella di posta.