Tips untuk Mengoptimalkan Query Database Laravel Framework - CRUDPRO

Tips untuk Mengoptimalkan Query Database Laravel Framework

Jika aplikasi Anda berjalan lambat atau menjalankan banyak query database, ikuti tip pengoptimalan kinerja di bawah ini untuk meningkatkan waktu buka aplikasi Anda.

1. Dapatkan kumpulan data yang besar

Tip ini terutama difokuskan pada peningkatan penggunaan memori aplikasi saat memproses kumpulan data besar.

Jika aplikasi Anda perlu memproses sejumlah besar catatan, alih-alih mendapatkan semuanya sekaligus, Buat subset dari hasil dan proses dalam kelompok.

Untuk mendapatkan banyak hasil dari tabel yang disebut posting, Anda biasanya melakukan hal berikut:

$posts = Post::all(); // when using eloquent
$posts = DB::table('posts')->get(); // when using query builder

foreach ($posts as $post){
 // Process posts
}

Contoh di atas mengambil dan memproses semua record dari tabel posts. Bagaimana jika tabel ini memiliki 1 juta baris? Anda akan segera kehabisan memori.

Untuk menghindari masalah saat bekerja dengan kumpulan data besar, Anda bisa mendapatkan subset dari hasil dan memprosesnya sebagai berikut:

Opsi 1: Menggunakan Chunk

// when using eloquent
$posts = Post::chunk(100, function($posts){
    foreach ($posts as $post){
     // Process posts
    }
});
 
// when using query builder
$posts = DB::table('posts')->chunk(100, function ($posts){
    foreach ($posts as $post){
     // Process posts
    }
});

Contoh di atas mengambil 100 record dari tabel posts, memprosesnya, mengambil 100 record lainnya, dan memprosesnya.Iterasi ini akan berlanjut sampai semua record diproses.

Pendekatan ini akan membuat lebih banyak query basis data tetapi lebih hemat memori. Biasanya, pemrosesan kumpulan data besar harus jadi boleh saja membuat lebih banyak query saat berjalan di latar belakang untuk menghindari kehabisan memori saat memproses kumpulan data besar.

Opsi 2: Menggunakan Cursor

// when using eloquent
foreach (Post::cursor() as $post){
   // Process a single post
}
 
// when using query builder
foreach (DB::table('posts')->cursor() as $post){
   // Process a single post
}

Contoh di atas membuat query database tunggal, mengambil semua catatan dari tabel, dan menghidrasi model Eloquent satu per satu. Dengan pendekatan ini, hanya satu query database yang dijalankan untuk mengambil semua posting. Namun, ia menggunakan generator PHP untuk mengoptimalkan penggunaan memori.

Kapan saya bisa menggunakannya?

Ini sangat mengoptimalkan penggunaan memori di tingkat aplikasi, tetapi karena kami mendapatkan semua entri dari tabel. Penggunaan memori instance database akan terus tinggi.

Jika aplikasi web yang menjalankan aplikasi Anda memiliki memori rendah dan instans database memiliki memori tinggi, sebaiknya gunakan kursor. Namun, jika instance database Anda tidak memiliki cukup memori, sebaiknya tetap menggunakan chunk.

Opsi 3: Gunakan chunkById

// when using eloquent
$posts = Post::chunkById(100, function($posts){
    foreach ($posts as $post){
     // Process posts
    }
});
 
// when using query builder
$posts = DB::table('posts')->chunkById(100, function ($posts){
    foreach ($posts as $post){
     // Process posts
    }
});

Perbedaan utama antara chunk dan chunkById adalah bahwa chunk didasarkan pada offset dan limit. di samping itu chunkById mendapatkan hasil database berdasarkan field id. Bidang id ini biasanya merupakan field bilangan bulat, dan dalam banyak kasus ini akan menjadi field yang bertambah secara otomatis.

query dari chunk dan chunkById adalah sebagai berikut:

chunk
select * from posts offset 0 limit 100
select * from posts offset 0 limit 100
chunkById
select * from posts order by id asc limit 100
select * from posts where id > 100 order by id asc limit 100

Secara umum, batas offset lambat digunakan dan harus dihindari. Artikel ini merinci masalah yang terkait dengan penggunaan offset.

chunkById menggunakan field id yang merupakan bilangan bulat tipe integer, dan query menggunakan klausa where, yang membuat query lebih cepat.

Kapan saya bisa menggunakan chunkById?

Jika tabel database memiliki kolom kunci utama yang merupakan bidang peningkatan otomatis.

2. Pilih hanya kolom yang Anda butuhkan

Untuk mendapatkan hasil dari tabel database, Anda biasanya melakukan hal berikut:

$posts = Post::find(1); //When using eloquent
$posts = DB::table('posts')->where('id','=',1)->first(); //When using query builder

Kode di atas akan menjadi query seperti berikut:

select * from posts where id = 1 limit 1

Seperti yang Anda lihat, query melakukan select *. Ini berarti Anda mendapatkan semua kolom dari tabel database. Jika Anda benar-benar membutuhkan semua kolom dalam tabel, ini tidak masalah.

Sebaliknya, jika Anda hanya membutuhkan kolom tertentu (id, judul), Anda hanya bisa mendapatkan kolom tersebut sebagai berikut:

$posts = Post::select(['id','title'])->find(1); //When using eloquent
$posts = DB::table('posts')->where('id','=',1)->select(['id','title'])->first(); //When using query builder

Kode di atas akan menjadi query seperti berikut:

select id,title from posts where id = 1 limit 1

3. Gunakan pluck jika Anda membutuhkan tepat satu atau dua kolom dari database

Tip ini berfokus pada waktu yang dihabiskan setelah mengambil hasil dari database. Ini tidak mempengaruhi waktu query yang sebenarnya.

Seperti disebutkan di atas, untuk mendapatkan kolom tertentu,

$posts = Post::select(['title','slug'])->get(); //When using eloquent
$posts = DB::table('posts')->select(['title','slug'])->get(); //When using query builder

Ketika saya menjalankan kode di atas, terlihat seperti ini di belakang layar:

Jalankan `select title, slug from posts` query dalam database

Buat model Post baru untuk setiap baris yang Anda dapatkan (dalam kasus Query Builder, buat objek standar PHP) Buat collection baru menggunakan model Post Mengembalikan collection sekarang, untuk mengakses hasilnya:

foreach ($posts as $post){
    // $post is a Post model or php standard object
    $post->title;
    $post->slug;
}

Pendekatan di atas memiliki overhead tambahan untuk menghidrasi model Post dari setiap baris dan membuat koleksi objek-objek ini. Ini bagus jika Anda benar-benar membutuhkan contoh model Post alih-alih data.

Namun, jika Anda hanya membutuhkan dua nilai ini, Anda dapat melakukan hal berikut:

$posts = Post::pluck('title', 'slug'); //When using eloquent
$posts = DB::table('posts')->pluck('title','slug'); //When using query builder

Ketika saya menjalankan kode di atas, terlihat seperti ini di belakang layar:

Jalankan `select title, slug from posts` query permintaan ke database Buat array dengan judul sebagai nilai array dan slug sebagai kunci array. Return array dengan fortmat [ slug => title, slug => title ]

Sekarang, untuk mengakses hasilnya
foreach ($posts as $slug => $title){
    // $title is the title of a post
    // $slug is the slug of a post
}

Jika Anda hanya ingin mendapatkan satu kolom, Anda dapat:

$posts = Post::pluck('title'); //When using eloquent
$posts = DB::table('posts')->pluck('title'); //When using query builder
foreach ($posts as  $title){
    // $title is the title of a post
}

Dengan pendekatan di atas, Anda tidak perlu membuat objek Post di setiap baris. Oleh karena itu, ini mengurangi penggunaan memori dan Waktu yang dihabiskan untuk memproses hasil query.

Kami menyarankan Anda menggunakan pendekatan di atas hanya dengan kode baru. Saya pribadi merasa bahwa saya akan kembali dan memfaktorkan ulang kode anda mengikuti tip di atas tidak sepadan dengan waktu yang dihabiskan untuk itu. Refactor kode yang ada hanya jika kode sedang diproses dalam skala besar jika Anda memiliki kumpulan data atau waktu luang.

4. menghitung baris menggunakan query dari collection

Untuk menghitung jumlah total baris dalam tabel, Anda biasanya melakukan hal berikut:

$posts = Post::all()->count(); //When using eloquent
$posts = DB::table('posts')->get()->count(); //When using query builder
Ini akan menghasilkan query berikut:
select * from posts

Pendekatan di atas mendapatkan semua baris dari tabel, memuatnya ke dalam objek koleksi dan menghitung hasilnya. Ini berfungsi dengan baik ketika tabel database memiliki sejumlah kecil baris. Namun, dengan cepat kehabisan memori. tabel menjadi lebih besar.

Alih-alih pendekatan di atas, Anda dapat langsung menghitung jumlah baris dalam database itu sendiri.

Ini akan menghasilkan query berikut:
select count(*) from posts

*Penghitungan baris dalam SQL adalah proses yang lambat, dan kinerja akan menurun jika ada terlalu banyak baris dalam tabel database. Penghitungan baris harus dihindari sebisa mungkin.

5. Hindari query N + 1 dengan hubungan membaca yang antusias

Anda mungkin telah mendengar tip ini jutaan kali. Jadi saya membuatnya sesingkat dan sesederhana mungkin. Mari kita asumsikan Anda memiliki skenario berikut:

class PostController extends Controller
{
    public function index()
    {
        $posts = Post::all();
        return view('posts.index', ['posts' => $posts ]);
    }
}
// posts/index.blade.php file
@foreach($posts as $post)
    <li>
        <h3>{{ $post->title }}</h3>
        <p>Author: {{ $post->author->name }}</p>
    </li>
@endforeach

Kode di atas mendapatkan semua posting dan menampilkan judul posting dan penulisnya di halaman web. Ini mengasumsikan bahwa model posting memiliki hubungan penulis.

Menjalankan kode di atas akan menjalankan query berikut:
select * from posts // Assume this query returned 5 posts
select * from authors where id = { post1.author_id }
select * from authors where id = { post2.author_id }
select * from authors where id = { post3.author_id }
select * from authors where id = { post4.author_id }
select * from authors where id = { post5.author_id }

Seperti yang Anda lihat, ada satu permintaan untuk mendapatkan kiriman dan lima untuk mendapatkan penulis kiriman (karena kami menganggap ada lima kiriman). Oleh karena itu, untuk setiap kiriman yang Anda ambil, satu query terpisah dibuat untuk mengambil penulisnya.

Jadi jika jumlah postingan adalah N, maka query N+1 dijalankan (satu query untuk mendapatkan postingan dan N untuk mendapatkan penulis setiap postingan). Ini umumnya dikenal sebagai masalah query N+1.

Untuk menghindarinya, lakuakan eager load author's relationship dengan posts lihat contoh kode dibawah:

$posts = Post::all(); // Avoid doing this
$posts = Post::with(['author'])->get(); // Do this instead

Menjalankan kode di atas akan menjalankan query berikut:

select * from posts // Assume this query returned 5 posts
select * from authors where id in( { post1.author_id }, { post2.author_id }, { post3.author_id }, { post4.author_id }, { post5.author_id } )

6. Relasi Bersarang Menggunakan Eager Load

Dari contoh di atas, misalkan kreator milik tim dan Anda juga ingin menampilkan nama tim. Itu sebabnya buat file blade seperti yang ditunjukkan di bawah ini.

@foreach($posts as $post)
    <li>
        <h3>{{ $post->title }}</h3>
        <p>Author: {{ $post->author->name }}</p>
        <p>Author's Team: {{ $post->author->team->name }}</p>
    </li>
@endforeach
Saya melakukan yang berikut sekarang
$posts = Post::with(['author'])->get();
Akan menghasilkan query berikut:
select * from posts // Assume this query returned 5 posts
select * from authors where id in( { post1.author_id }, { post2.author_id }, { post3.author_id }, { post4.author_id }, { post5.author_id } )
select * from teams where id = { author1.team_id }
select * from teams where id = { author2.team_id }
select * from teams where id = { author3.team_id }
select * from teams where id = { author4.team_id }
select * from teams where id = { author5.team_id }

Seperti yang Anda lihat, meskipun kami sangat ingin memuat hubungan penulis, itu masih membuat lebih banyak pertanyaan. Karena kita tidak bersemangat memuat hubungan tim pada penulis.

Kita dapat memperbaikinya dengan melakukan hal berikut:
$posts = Post::with(['author.team'])->get();

Menjalankan kode di atas akan menjalankan query berikut:

select * from posts // Assume this query returned 5 posts
select * from authors where id in( { post1.author_id }, { post2.author_id }, { post3.author_id }, { post4.author_id }, { post5.author_id } )
select * from teams where id in( { author1.team_id }, { author2.team_id }, { author3.team_id }, { author4.team_id }, { author5.team_id } )

dengan menggunakan eager loading relasi bersarang atau nested ,maka mengurangi jumlah query dari 11 menjadi 3

7. Jangan memuat belongsTo untuk relasi jika anda hanya memerlukan `id`

Bayangkan Anda memiliki dua tabel post dan author. Tabel post memiliki kolom author_id yang mewakili milik hubungan di tabel penulis.

Untuk mendapatkan id author post, kami biasanya melakukannya:
$post = Post::findOrFail(<post id>);
$post->author->id;
Ini akan mengeksekusi dua queri.
select * from posts where id = <post id> limit 1
select * from authors where id = <post author id> limit 1

Sebagai gantinya, Anda bisa mendapatkan id author secara langsung sebagai berikut:

$post = Post::findOrFail(<post id>);
$post->author_id; // posts table has a column author_id which stores id of the author
*Kapan saya bisa menggunakan pendekatan di atas?

Jika baris direferensikan, Anda dapat menggunakan pendekatan di atas jika Anda yakin bahwa baris selalu ada di tabel penulis. Di dalam table pos.

8. Hindari query yang tidak perlu

Seringkali kita membuat query database yang tidak perlu Perhatikan contoh di bawah ini Seringkali kita membuat query database yang tidak perlu Perhatikan contoh di bawah ini.

<?php
 
class PostController extends Controller
{
    public function index()
    {
        $posts = Post::all();
        $private_posts = PrivatePost::all();
        return view('posts.index', ['posts' => $posts, 'private_posts' => $private_posts ]);
    }
}

Kode di atas mendapatkan baris dari dua tabel yang berbeda (misalnya post, private_posts) dan meneruskannya ke tampilan. File tampilan terlihat seperti ini:

// posts/index.blade.php
 
@if( request()->user()->isAdmin() )
    <h2>Private Posts</h2>
    <ul>
        @foreach($private_posts as $post)
            <li>
                <h3>{{ $post->title }}</h3>
                <p>Published At: {{ $post->published_at }}</p>
            </li>
        @endforeach
    </ul>
@endif
 
<h2>Posts</h2>
<ul>
    @foreach($posts as $post)
        <li>
            <h3>{{ $post->title }}</h3>
            <p>Published At: {{ $post->published_at }}</p>
        </li>
    @endforeach
</ul>

Seperti disebutkan di atas, $private_posts hanya dapat dilihat oleh pengguna yang merupakan administrator. Sisanya tidak terlihat oleh semua pengguna postingan ini.

Masalahnya di sini adalah ketika kita
$posts = Post::all();
$private_posts = PrivatePost::all();

Saya menjalankan dua query. Pertama saya dapatkan record dari table posts dan yang lain dapatkan dari table private_posts.

Record di tabel private_posts hanya dapat dilihat oleh pengguna admin. Tapi kami masih menulis queri untuk mendapatkan record ini berlaku untuk semua pengguna, meskipun tidak terlihat.

Untuk menghindari queri tambahan ini, Anda dapat mengubah logika menjadi:
$posts = Post::all();
$private_posts = collect();
if( request()->user()->isAdmin() ){
    $private_posts = PrivatePost::all();
}

Dengan mengubah logika di atas, kami akan membuat dua query untuk pengguna admin dan satu queri untuk semua pengguna lainnya.

9. Menggabungkan query Serupa

Anda mungkin perlu menjalankan queri untuk mendapatkan tipe baris yang berbeda dari tabel yang sama.

$published_posts = Post::where('status','=','published')->get();
$featured_posts = Post::where('status','=','featured')->get();
$scheduled_posts = Post::where('status','=','scheduled')->get();

Kode di atas mendapatkan baris dengan status berbeda dari tabel yang sama. Kodenya terlihat seperti ini:

select * from posts where status = 'published'
select * from posts where status = 'featured'
select * from posts where status = 'scheduled'

Seperti yang Anda lihat, saya menjalankan tiga queri berbeda terhadap tabel yang sama untuk mendapatkan record. Anda dapat memfaktorkan ulang kode ini buat hanya satu query basis data.

$posts =  Post::whereIn('status',['published', 'featured', 'scheduled'])->get();
$published_posts = $posts->where('status','=','published');
$featured_posts = $posts->where('status','=','featured');
$scheduled_posts = $posts->where('status','=','scheduled');

select * from posts where status in ( 'published', 'featured', 'scheduled' )

Kode di atas membuat koleksi terpisah untuk setiap status dengan membuat satu query yang mengambil semua kiriman dengan salah satu status tertentu dan memfilter kiriman yang dikembalikan menurut status. Jadi kita masih punya tiga variabel berbeda dengan statusnya dan hanya akan membuat satu queri.

10. Tambahkan index ke query kolom

Jika Anda ingin menambahkan kondisi where ke kolom berbasis string dan menjalankan query, sebaiknya tambahkan indeks ke kolom. query jauh lebih cepat saat menanyakan baris menggunakan kolom indeks.

$posts = Post::where('status','=','published')->get();

Dalam contoh di atas, kita mengquery record dengan menambahkan kondisi where ke kolom status. Kita bisa meningkatkan Performa query dengan menambahkan migrasi database berikut.

Schema::table('posts', function (Blueprint $table) {
   $table->index('status');
});

11. Gunakan simplePaginate alih-alih Paginate

Saat kami membuka halaman hasil, kami biasanya
$posts = Post::paginate(20);

Ini akan mengeksekusi dua query. query pertama mendapatkan hasil yang diberi halaman dan query kedua menghitung jumlah total baris dalam tabel. Menghitung baris dalam tabel adalah operasi lambat yang berdampak negatif pada kinerja query.

Jadi mengapa laravel menghitung jumlah total baris?

Untuk menghasilkan tautan pagination, Laravel menghitung jumlah total baris. Oleh karena itu, ketika tautan pagination dibuat, Anda tahu sebelumnya berapa banyak halaman yang ada dan nomor halaman sebelumnya. Oleh karena itu, Anda dapat dengan mudah pergi ke halaman yang Anda butuhkan.

Di sisi lain, menjalankan simplePaginate tidak menghitung jumlah total baris dan query jauh lebih cepat daripada pendekatan paginate. Namun, Anda tidak akan dapat mengetahui nomor halaman terakhir dan akan dapat melompat ke halaman lain.

Jika Anda memiliki terlalu banyak baris dalam tabel database, sebaiknya hindari paginate dan jalankan simplePaginate sebagai gantinya.

$posts = Post::paginate(20); // Generates pagination links for all the pages
$posts = Post::simplePaginate(20); // Generates only next and previous pagination links
Kapan menggunakan paginate vs Simple paginate?

Lihat tabel perbandingan di bawah ini dan tentukan apakah paginate atau simple paginate tepat untuk Anda

Penggunaan pagination ketentuan pagianation
Jumlah baris dalam tabel database kecil dan tidak bertambah paginate/simplePaginate
tabel database memiliki begitu banyak baris dan tumbuh dengan cepat simplePaginate
Wajib memberikan opsi kepada pengguna untuk melompat ke halaman tertentu paginate
Tidak aktif menggunakan tautan pagination simplePaginate
UI/UX tidak memengaruhi pengalihan tautan pagination bernomor ke tautan pagination berikutnya/sebelumnya simplePaginate
Gunakan tombol "Muat Lebih Banyak" atau "Gulir Tak Terbatas" untuk pagination simplePaginate

12. Hindari menggunakan wildcard terkemuka (LIKE kata kunci)

Saat mencoba mengquery hasil yang cocok dengan pola tertentu, biasanya terlihat seperti ini:

select * from table_name where column like %keyword%

query di atas akan menjadi pemindaian tabel penuh. Jika Anda tahu bahwa kata kunci berada di awal nilai kolom, Anda dapat menanyakan hasilnya sebagai berikut:

select * from table_name where column like keyword%

13. Jangan gunakan fungsi SQL di klausa where

Kami menyarankan Anda untuk tidak menggunakan fungsi SQL di klausa where karena akan menyebabkan pemindaian tabel penuh. Lihat di bawah ini contoh. Untuk menanyakan hasil berdasarkan tanggal tertentu, Anda biasanya

$posts = POST::whereDate('created_at', '>=', now() )->get();
Ini akan menghasilkan query yang mirip dengan di bawah ini
select * from posts where date(created_at) >= 'timestamp-here'

query di atas akan menghasilkan pemindaian tabel penuh, karena kondisi di mana tidak diterapkan hingga fungsi tanggal dievaluasi.

Kami dapat memfaktorkan ulang ini untuk menghindari fungsi sql tanggal seperti di bawah ini

$posts = Post::where('created_at', '>=', now() )->get();
select * from posts where created_at >= 'timestamp-here'

14. Jangan menambahkan terlalu banyak kolom ke tabel

Kami menyarankan Anda membatasi jumlah total kolom dalam tabel. Anda dapat menggunakan database relasional seperti mysql untuk membagi tabel dengan banyak kolom menjadi beberapa tabel. Mereka dapat digabungkan menggunakan primary key dan foreign key.

Jika Anda menambahkan terlalu banyak kolom ke tabel, catatan individual akan panjang dan pemindaian tabel akan lambat. Saat Anda menjalankan query pilih *, Anda mendapatkan sekumpulan kolom yang sebenarnya tidak Anda perlukan.

15. Pisahkan kolom tipe data teks ke dalam tabel Anda sendiri

Tip ini adalah pengalaman pribadi dan bukan cara standar untuk mendesain tabel database. Saya merekomendasikan untuk Ikuti tip ini hanya jika tabel Anda memiliki terlalu banyak catatan atau tumbuh dengan cepat.

Jika tabel memiliki kolom dengan jumlah data yang besar, ukuran masing-masing record akan sangat besar. Saya Secara pribadi, salah satu proyek memengaruhi waktu query.

Misalkan Anda memiliki tabel bernama post yang memiliki kolom content yang menyimpan konten posting blog Anda.

Konten postingan blog sangat besar, dan dalam banyak kasus, data ini hanya diperlukan jika seseorang melihatnya. Sebuah posting blog tertentu.

Oleh karena itu, memisahkan kolom ini dari tabel posting akan secara signifikan meningkatkan kinerja query jika ada terlalu banyak post.

16. Cara yang lebih baik untuk mendapatkan baris terbaru dari tabel

Ketika kami ingin mengambil baris terbaru dari sebuah tabel, kami akan sering melakukannya

$posts = Post::latest()->get();
// or $posts = Post::orderBy('created_at', 'desc')->get()
Pendekatan di atas akan menghasilkan query SQL berikut:
select * from posts order by created_at desc

query pada dasarnya mengurutkan baris dalam urutan menurun berdasarkan kolom create_at. Kolom create_at adalah Untuk kolom berbasis string, pengurutan hasil dengan cara ini seringkali lambat.

Jika tabel database memiliki ID kunci utama atau primary key yang bertambah secara otomatis, dalam banyak kasus baris terbaru akan selalu ID terbaik. Karena field id adalah field bilangan bulat dan juga merupakan kunci utama, pengurutan hasil akan jauh lebih cepat. kunci ini. Jadi, inilah cara yang lebih baik untuk mendapatkan baris terbaru:

$posts = Post::latest('id')->get();
// or $posts = Post::orderBy('id', 'desc')->get();
select * from posts order by id desc

17. Optimalkan Sisipan MySQL

Sejauh ini, kami telah mencari cara untuk mengoptimalkan query pemilihan untuk mendapatkan hasil dari database. Dalam kebanyakan kasus, Anda hanya perlu mengoptimalkan query baca. Namun, mungkin ada kalanya Anda perlu mengoptimalkan query penyisipan dan pembaruan. Saya menemukan artikel menarik tentang mengoptimalkan sisipan mysql Ini membantu mengoptimalkan sisipan dan pembaruan yang lambat.

18. Periksa dan optimalkan query

Tidak ada solusi universal untuk mengoptimalkan query di Laravel. Hanya Anda yang tahu apa yang dilakukan aplikasi tersebut. Jumlah query, jumlah query yang benar-benar digunakan. Oleh karena itu, periksa pertanyaan yang dibuat oleh aplikasi Membantu menentukan dan mengurangi jumlah total query yang dibuat.

Ada alat khusus yang dapat membantu Anda memeriksa query yang dibuat di setiap halaman.

Catatan: Kami menyarankan Anda untuk tidak menjalankan alat ini di lingkungan produksi. Jalankan ini di lingkungan produksi Aplikasi memperlambat kinerja aplikasi dan, ketika disusupi, memungkinkan pengguna yang tidak berwenang mengakses informasi sensitif.

  • Laravel Debugbar - Laravel Debugbar memiliki tab yang disebut Database Ini akan menunjukkan kepada Anda semua query yang dijalankan saat Anda mengunjungi halaman tersebut. Buka semua halaman aplikasi Anda dan lihat query yang dijalankan di setiap halaman.
  • Clockwork - Clockwork sama dengan laraveldebugbar. Namun, alih-alih memasukkan bilah alat ke situs web Anda, ini menampilkan informasi debug sebagai `developer tool window` atau sebagai. UI mandiri dengan akses ke aplikasi yourappurl/clockwork.
  • Laravel Telescope - The Laravel Telescope adalah pendamping debugging yang hebat untuk mengembangkan aplikasi Laravel secara lokal. Setelah memasang teleskop, Anda dapat mengakses dasbor dengan mengakses URL yourappurl/teleskop. Di dasboard teleskop, buka tab query untuk melihat semua query yang dijalankan aplikasi Anda.