Kadangkala apabila anda tidak sabar-sabar memuatkan perhubungan pada model Laravel, anda mungkin mahu mengehadkan bilangan model berkaitan yang dikembalikan.
Sebagai contoh, pada platform blog, anda mungkin mahu memuatkan setiap pengarang dalam sistem bersama tiga siaran mereka.
Dalam versi Laravel yang lebih lama, mengehadkan perhubungan yang sarat dengan keinginan adalah tugas yang agak sukar. Saya tidak pernah benar-benar dapat mencari cara yang elegan untuk melakukannya yang dirasakan betul. Jadi saya biasanya memasang pakej staudenmeir/eloquent-eager-limit Jonas Staudenmeir (@staudenmeir) yang menambahkan fungsi ini.
Namun, pada awal tahun ini, fungsi teras di sebalik pakej tersebut telah digabungkan ke dalam rangka kerja Laravel itu sendiri. Jadi ini bermakna dalam Laravel 11, kita boleh mengehadkan perhubungan yang dimuatkan dengan bersemangat tanpa perlu memasang sebarang pakej tambahan.
Mari kita lihat contoh.
Katakanlah kami mempunyai platform blog dan kami mahu memuatkan setiap pengarang dalam sistem bersama tiga siaran mereka.
Kita boleh mencapai ini menggunakan kaedah had dalam pertanyaan pemuatan yang bersemangat:
use App\Models\Post; use App\Models\Author; use Illuminate\Contracts\Database\Eloquent\Builder; $authors = Author::query() ->with([ 'posts' => fn (Builder $query): Builder => $query->limit(3), ]) ->get();
Seperti yang dapat kita lihat dalam contoh kod di atas, kami telah menentukan bahawa kami ingin memuatkan perhubungan siaran pada model AppModelsAuthor. Dalam pertanyaan pemuatan yang bersemangat, kami telah menggunakan kaedah had untuk menyatakan bahawa kami hanya mahu memuatkan tiga siaran.
Bagi sesiapa yang berminat, pertanyaan di atas akan menghasilkan dua pertanyaan SQL.
Pertanyaan pertama mengambil pengarang daripada pangkalan data:
SELECT * FROM `authors`
Pertanyaan kedua mengambil tiga siaran untuk setiap pengarang (dengan andaian kami mempunyai 5 pengarang dalam sistem):
SELECT * FROM ( SELECT *, row_number() OVER (PARTITION BY `posts`.`author_id`) AS `laravel_row` FROM `posts` WHERE `posts`.`author_id` IN (1, 2, 3, 4, 5) ) AS `laravel_table` WHERE `laravel_row` <= 3 ORDER BY `laravel_row`
Jika anda gemar membaca siaran ini, anda mungkin berminat untuk menyemak e-buku 220+ halaman saya "Battle Ready Laravel" yang merangkumi topik yang serupa dengan lebih mendalam.
Atau, anda mungkin ingin melihat ebook 440+ halaman saya yang lain "Menggunakan API dalam Laravel" yang mengajar anda cara menggunakan Laravel untuk menggunakan API daripada perkhidmatan lain.
Jika anda berminat untuk dikemas kini setiap kali saya menerbitkan siaran baharu, jangan ragu untuk mendaftar untuk surat berita saya.
Teruskan membina barangan yang hebat! ?
Atas ialah kandungan terperinci Hadkan Perhubungan yang Dimuatkan Eager pada Model Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!