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

Autore

Giovanni D'Ippolito

Pubblicato

03 November 2025

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

Condividi questo articolo

Articoli Correlati

Laravel

Laravel Service Container: Dependency Injection Made Easy

Comprendi il Service Container di Laravel e come sfruttare la Dependency Injection per codice più te...

11 Nov 2025 3 min
Leggi di più →
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 utente.

19 Nov 2025 3 min
Leggi di più →
Laravel

Laravel Testing: TDD con Pest PHP

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

27 Nov 2025 1 min
Leggi di più →

Rimani Aggiornato

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