Rumah >pembangunan bahagian belakang >tutorial php >Belajar menguasai skop pertanyaan di laravel

Belajar menguasai skop pertanyaan di laravel

Emily Anne Brown
Emily Anne Brownasal
2025-03-06 02:28:09506semak imbas
<p> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/174119929536701.jpg" class="lazy" alt="Learn to master Query Scopes in Laravel"> <s> </s></p> Apabila membina aplikasi Laravel, anda mungkin perlu menulis pertanyaan dengan kekangan yang digunakan di beberapa tempat di seluruh aplikasi. Mungkin anda sedang membina aplikasi multi-penyewa dan anda perlu menambah kekangan <p> kepada pertanyaan untuk ditapis oleh pasukan pengguna. Atau mungkin anda sedang membina blog dan anda perlu menambah kekangan <code>where</code> ke pertanyaan untuk menapis jika pos blog telah diterbitkan. <code>where</code> </p> Di Laravel, kita boleh menggunakan skop pertanyaan untuk membantu kita mengekalkan kekangan ini dengan kemas di satu tempat dan menggunakannya semula. <p> </p> Dalam artikel ini, kami akan mengkaji skop pertanyaan tempatan dan skop pertanyaan global. Kami akan mempelajari perbezaan antara kedua -dua, bagaimana untuk membuat skop pertanyaan anda sendiri, dan bagaimana menulis ujian untuk mereka. <p> </p> Selepas membaca artikel ini, anda harus dapat menggunakan skop pertanyaan dengan yakin dalam aplikasi Laravel anda. <p> </p> Apakah skop pertanyaan? <h1> </h1> <hr> Skop pertanyaan membolehkan anda menentukan kekangan dalam pertanyaan yang fasih dengan cara yang boleh diguna semula. Mereka biasanya ditakrifkan sebagai kaedah pada model Laravel, atau sebagai kelas yang melaksanakan <p> antara muka. <code>IlluminateDatabaseEloquentScope</code> </p> Bukan sahaja mereka sesuai untuk menentukan logik yang boleh diguna semula di satu tempat, tetapi mereka juga boleh membuat kod anda lebih mudah dibaca dengan menyembunyikan kekangan pertanyaan kompleks selepas panggilan fungsi mudah. <p> </p> julat pertanyaan dibahagikan kepada dua jenis: <p> </p> <ul> julat pertanyaan tempatan - anda mesti menggunakan julat ini secara manual untuk pertanyaan anda. <li> </li> Skop Pertanyaan Global - Secara lalai, julat ini digunakan untuk semua pertanyaan pada model, dengan syarat pertanyaan itu didaftarkan. <li> </li> </ul> Jika anda pernah menggunakan ciri "Delete Soft" yang dibina di Laravel, anda mungkin telah menggunakan skop pertanyaan tanpa disedari. Laravel menggunakan skop pertanyaan tempatan untuk memberi anda kaedah seperti <p> dan <code>withTrashed</code> pada model. Ia juga menggunakan skop pertanyaan global untuk menambah kekangan <code>onlyTrashed</code> secara automatik kepada semua pertanyaan pada model supaya rekod yang dipadam lembut tidak dikembalikan secara lalai dalam pertanyaan. <code>whereNull('deleted_at')</code> </p> Mari lihat cara membuat dan menggunakan skop pertanyaan tempatan dan skop pertanyaan global dalam aplikasi Laravel. <p> </p> Skop pertanyaan tempatan <h1> </h1> <hr> Skop pertanyaan tempatan ditakrifkan sebagai kaedah pada model fasih, yang membolehkan anda menentukan kekangan yang boleh digunakan secara manual untuk model pertanyaan. <p> </p> Katakan kami sedang membina aplikasi blog dengan panel admin. Di panel admin, kami mempunyai dua halaman: satu untuk penyenaraian catatan blog yang diterbitkan dan yang lain untuk menyenaraikan catatan blog yang tidak diterbitkan. <p></p> <p> kami mengandaikan bahawa pos blog diakses menggunakan model <code>AppModelsArticle</code> dan bahawa jadual pangkalan data mempunyai lajur kosong <code>published_at</code> untuk menyimpan masa penerbitan pos blog. Jika <code>published_at</code> disenaraikan pada masa lalu, jawatan blog dianggap telah diterbitkan. Jika <code>published_at</code> disenaraikan pada masa akan datang atau <code>null</code>, jawatan blog dianggap tidak diterbitkan. </p> <p> Untuk mendapatkan catatan blog yang diterbitkan, kami boleh menulis pertanyaan berikut: </p> <pre class="brush:php;toolbar:false"><code>use App\Models\Article; $publishedPosts = Article::query() ->where('published_at', '<', now()) ->get();</code></pre> <p> Untuk mendapatkan catatan blog yang tidak diterbitkan, kami boleh menulis pertanyaan berikut: </p> <pre class="brush:php;toolbar:false"><code>use App\Models\Article; use Illuminate\Contracts\Database\Eloquent\Builder; $unpublishedPosts = Article::query() ->where(function (Builder $query): void { $query->whereNull('published_at') ->orWhere('published_at', '>', now()); }) ->get();</code></pre> <p> pertanyaan di atas tidak begitu rumit. Tetapi, katakan kami menggunakannya di beberapa tempat di seluruh aplikasi. Oleh kerana bilangan kejadian meningkat, kemungkinan kita membuat kesilapan atau lupa untuk mengemas kini pertanyaan di satu tempat semakin meningkat. Sebagai contoh, pemaju secara tidak sengaja boleh menggunakan <code>>=</code> bukannya <code><</code> untuk memohon catatan blog yang diterbitkan. Sebagai alternatif, logik untuk menentukan sama ada catatan blog telah diterbitkan mungkin berubah dan kita perlu mengemas kini semua pertanyaan. </p> <p> Ini adalah di mana skop pertanyaan sangat berguna. Oleh itu, mari kita mengatur pertanyaan kami dengan membuat skop pertanyaan tempatan pada model <code>AppModelsArticle</code>. </p> <p> Skop pertanyaan tempatan ditakrifkan dengan membuat kaedah yang bermula dengan <code>scope</code> dan berakhir dengan nama skop yang diharapkan. Sebagai contoh, kaedah yang dinamakan <code>scopePublished</code> akan membuat julat <code>published</code> pada model. Kaedah ini harus menerima contoh <code>IlluminateContractsDatabaseEloquentBuilder</code> dan mengembalikan contoh <code>IlluminateContractsDatabaseEloquentBuilder</code>. </p> <p> kami menambah kedua -dua julat ke model <code>AppModelsArticle</code>: </p> <pre class="brush:php;toolbar:false"><code>declare(strict_types=1); namespace App\Models; use Illuminate\Contracts\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; final class Article extends Model { public function scopePublished(Builder $query): Builder { return $query->where('published_at', '<', now()); } public function scopeNotPublished(Builder $query): Builder { return $query->where(function (Builder $query): Builder { return $query->whereNull('published_at') ->orWhere('published_at', '>', now()); }); } // ... }</code> </p> <p> Seperti yang kita lihat dalam contoh di atas, kami memindahkan kekangan <code>where</code> dari pertanyaan sebelumnya ke dalam dua kaedah berasingan: <code>scopePublished</code> dan <code>scopeNotPublished</code>. Sekarang kita boleh menggunakan julat ini dalam pertanyaan kami seperti ini: </p> <pre class="brush:php;toolbar:false"><code>use App\Models\Article; $publishedPosts = Article::query() ->published() ->get(); $unpublishedPosts = Article::query() ->notPublished() ->get();</code></pre> <p> Dalam pendapat peribadi saya, saya dapati pertanyaan ini lebih mudah dibaca dan difahami. Ini juga bermakna bahawa jika kita perlu menulis sebarang pertanyaan dengan kekangan yang sama pada masa akan datang, kita boleh menggunakan semula skop ini. </p> <h1> Skop Pertanyaan Global </h1> <hr> <p> Skop pertanyaan global melaksanakan fungsi yang serupa dengan skop pertanyaan tempatan. Walau bagaimanapun, ia tidak digunakan secara manual berdasarkan pertanyaan demi pertanyaan, tetapi secara automatik terpakai kepada semua pertanyaan pada model. </p> <p> Seperti yang telah kami sebutkan tadi, fungsi terbina dalam "Soft Delete" terbina dalam <code>IlluminateDatabaseEloquentSoftDeletingScope</code> skop pertanyaan global. Julat ini secara automatik menambah kekangan <code>whereNull('deleted_at')</code> kepada semua pertanyaan pada model. Jika anda berminat untuk memahami bagaimana ia berfungsi, anda boleh menyemak kod sumber di GitHub di sini. </p> <p> Sebagai contoh, katakan anda sedang membina aplikasi blog multi-penyewa dengan panel admin. Anda mungkin hanya mahu membenarkan pengguna melihat artikel yang dimiliki oleh pasukan mereka. Jadi anda mungkin menulis pertanyaan seperti ini: </p> <pre class="brush:php;toolbar:false"><code>use App\Models\Article; $publishedPosts = Article::query() ->where('published_at', '<', now()) ->get();</code></pre> <p> Pertanyaan ini bagus, tetapi mudah lupa untuk menambah kekangan <code>where</code>. Jika anda menulis pertanyaan lain dan lupa untuk menambah kekangan, anda akan berakhir dengan ralat dalam aplikasi anda yang akan membolehkan pengguna berinteraksi dengan artikel yang bukan sebahagian daripada pasukan mereka. Sudah tentu, kami tidak mahu ini berlaku! </p> <p> Untuk mengelakkan ini, kita boleh membuat skop global yang kita boleh secara automatik memohon kepada semua pertanyaan model <code>AppModelArticle</code> kami. </p> <h3>#bagaimana untuk membuat skop pertanyaan global </h3> <p> Mari buat skop pertanyaan global yang menapis semua pertanyaan oleh lajur <code>team_id</code>. </p> <p> Sila ambil perhatian bahawa untuk tujuan artikel ini, kami menyimpan contohnya dengan mudah. Dalam aplikasi kehidupan sebenar, anda mungkin mahu menggunakan pendekatan yang lebih kuat untuk menangani situasi seperti pengguna tidak disahkan atau pengguna milik beberapa pasukan. Tetapi buat masa ini, mari kita simpan mudah supaya kita dapat memberi tumpuan kepada konsep skop pertanyaan global. </p> <p> kami akan menjalankan perintah artisan berikut di terminal: </p> <pre class="brush:php;toolbar:false"><code>use App\Models\Article; use Illuminate\Contracts\Database\Eloquent\Builder; $unpublishedPosts = Article::query() ->where(function (Builder $query): void { $query->whereNull('published_at') ->orWhere('published_at', '>', now()); }) ->get();</code></pre> <p> Ini sepatutnya membuat fail <code>app/Models/Scopes/TeamScope.php</code> baru. Kami akan membuat beberapa kemas kini ke fail ini dan kemudian melihat kod siap: </p> <pre class="brush:php;toolbar:false"><code>declare(strict_types=1); namespace App\Models; use Illuminate\Contracts\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; final class Article extends Model { public function scopePublished(Builder $query): Builder { return $query->where('published_at', '<', now()); } public function scopeNotPublished(Builder $query): Builder { return $query->where(function (Builder $query): Builder { return $query->whereNull('published_at') ->orWhere('published_at', '>', now()); }); } // ... }</code></pre> <p> Dalam contoh kod di atas, kita dapat melihat bahawa kita mempunyai kelas baru yang melaksanakan antara muka <code>IlluminateDatabaseEloquentScope</code> dan mempunyai satu kaedah yang dipanggil <code>apply</code>. Inilah cara kita menentukan kekangan untuk memohon kepada pertanyaan model. </p> <p> Skop global kami kini tersedia. Kami boleh menambah ini kepada mana -mana model yang kami mahu menyempitkan pertanyaan kepada pasukan pengguna. </p> <p> mari kita memohon kepada model <code>AppModelsArticle</code>. </p> <h3>#menggunakan skop pertanyaan global </h3> <p> Terdapat beberapa cara untuk menggunakan skop global kepada model. Kaedah pertama ialah menggunakan atribut <code>IlluminateDatabaseEloquentAttributesScopedBy</code> pada model: </p> <pre class="brush:php;toolbar:false"><code>use App\Models\Article; $publishedPosts = Article::query() ->published() ->get(); $unpublishedPosts = Article::query() ->notPublished() ->get();</code></pre> <p> kaedah lain ialah menggunakan <code>booted</code> kaedah dalam kaedah <code>addGlobalScope</code> model: </p> <pre class="brush:php;toolbar:false"><code>use App\Models\Article; $articles = Article::query() ->where('team_id', Auth::user()->team_id) ->get();</code></pre> <p> kedua -dua kaedah menggunakan kekangan <code>where('team_id', Auth::user()->team_id)</code> kepada semua pertanyaan pada model <code>AppModelsArticle</code>. </p> <p> ini bermakna anda kini boleh menulis pertanyaan tanpa bimbang tentang penapisan oleh <code>team_id</code> lajur: </p> <pre class="brush:php;toolbar:false"><code>php artisan make:scope TeamScope</code></pre> <p> Jika kita menganggap bahawa pengguna tergolong dalam pasukan dengan <code>team_id</code> menjadi <code>1</code>, SQL berikut akan dihasilkan untuk pertanyaan di atas: </p> <pre class="brush:php;toolbar:false"><code>declare(strict_types=1); namespace App\Models\Scopes; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Scope; use Illuminate\Support\Facades\Auth; final readonly class TeamScope implements Scope { /** * Apply the scope to a given Eloquent query builder. */ public function apply(Builder $builder, Model $model): void { $builder->where('team_id', Auth::user()->team_id); } }</code></pre> <p> Ini sejuk, bukan? ! </p> <h3> Skop Pertanyaan Global #Anonymous </h3> <p> Satu lagi cara untuk menentukan dan menggunakan skop pertanyaan global adalah dengan menggunakan skop global tanpa nama. </p> <p> mari kita mengemas kini model <code>AppModelsArticle</code> kami untuk menggunakan skop global tanpa nama: </p> <pre class="brush:php;toolbar:false"><code>declare(strict_types=1); namespace App\Models; use App\Models\Scopes\TeamScope; use Illuminate\Database\Eloquent\Attributes\ScopedBy; use Illuminate\Database\Eloquent\Model; #[ScopedBy(TeamScope::class)] final class Article extends Model { // ... }</code></pre> <p> Dalam contoh kod di atas, kami menggunakan kaedah <code>addGlobalScope</code> untuk menentukan skop global tanpa nama dalam kaedah <code>booted</code> model. <code>addGlobalScope</code> kaedah menerima dua parameter: </p> <ul> <li> Nama skop - jika anda perlu mengabaikannya dalam pertanyaan anda, anda boleh menggunakan nama ini untuk merujuk kepada skop </li> <li> Kekangan Skop - Tentukan penutupan untuk memohon kekangan </li> </ul> <p> Seperti kaedah lain, ini menggunakan kekangan <code>where('team_id', Auth::user()->team_id)</code> kepada semua pertanyaan pada model <code>AppModelsArticle</code>. </p> <p> Dalam pengalaman saya, skop global tanpa nama tidak biasa seperti menentukan skop global dalam kelas yang berasingan. Tetapi ia bermanfaat untuk mengetahui bahawa mereka boleh didapati sekiranya berlaku kecemasan. </p> <h3> #gnore scope query query </h3> <p> Kadang -kadang anda mungkin ingin menulis pertanyaan yang tidak menggunakan skop pertanyaan global yang telah digunakan untuk model. Sebagai contoh, anda mungkin membina laporan laporan atau analisis yang perlu mengandungi semua rekod tanpa mengira skop pertanyaan global. </p> <p> Jika ini berlaku, anda boleh menggunakan salah satu daripada dua kaedah untuk mengabaikan skop global. </p> <p> Kaedah pertama ialah <code>withoutGlobalScopes</code>. Kaedah ini membolehkan anda mengabaikan semua skop global pada model jika tiada parameter yang diserahkan kepadanya: </p> <pre class="brush:php;toolbar:false"><code>use App\Models\Article; $publishedPosts = Article::query() ->where('published_at', '<', now()) ->get();</code></pre> <p> atau, jika anda ingin mengabaikan hanya satu set skop global yang diberikan, anda boleh lulus nama skop ke kaedah <code>withoutGlobalScopes</code>: </p> <pre class="brush:php;toolbar:false"><code>use App\Models\Article; use Illuminate\Contracts\Database\Eloquent\Builder; $unpublishedPosts = Article::query() ->where(function (Builder $query): void { $query->whereNull('published_at') ->orWhere('published_at', '>', now()); }) ->get();</code></pre> <p> Dalam contoh di atas, kita mengabaikan <code>AppModelsScopesTeamScope</code> dan satu lagi skop global tanpa nama fiksyen yang dipanggil <code>another_scope</code>. </p> <p> atau, jika anda ingin mengabaikan hanya satu skop global, anda boleh menggunakan kaedah <code>withoutGlobalScope</code>: </p> <pre class="brush:php;toolbar:false"><code>declare(strict_types=1); namespace App\Models; use Illuminate\Contracts\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; final class Article extends Model { public function scopePublished(Builder $query): Builder { return $query->where('published_at', '<', now()); } public function scopeNotPublished(Builder $query): Builder { return $query->where(function (Builder $query): Builder { return $query->whereNull('published_at') ->orWhere('published_at', '>', now()); }); } // ... }</code></pre> <h3> #precaations untuk skop pertanyaan global </h3> <p> Adalah penting untuk diingat bahawa skop pertanyaan global hanya digunakan untuk pertanyaan yang dibuat melalui model. Jika anda menulis pertanyaan pangkalan data menggunakan penampilan <code>IlluminateSupportFacadesDB</code>, skop pertanyaan global tidak digunakan. </p> <p> Sebagai contoh, katakan anda menulis pertanyaan ini dan anda mahu ia merangkak hanya artikel milik pasukan log masuk: </p> <pre class="brush:php;toolbar:false"><code>use App\Models\Article; $publishedPosts = Article::query() ->published() ->get(); $unpublishedPosts = Article::query() ->notPublished() ->get();</code></pre> <p> Dalam pertanyaan di atas, walaupun skop pertanyaan global <code>AppModelsArticle</code> ditakrifkan pada model <code>AppModelsScopesTeamScope</code>, skop tidak akan digunakan. Oleh itu, anda perlu memastikan bahawa kekangan digunakan secara manual dalam pertanyaan pangkalan data. </p> <h1> menguji skop pertanyaan tempatan </h1> <hr> <p> Sekarang kita telah belajar bagaimana untuk membuat dan menggunakan skop pertanyaan, kita akan melihat cara menulis ujian untuk mereka. </p> <p> Terdapat beberapa cara untuk menguji skop pertanyaan, dan kaedah yang anda pilih mungkin bergantung pada keutamaan peribadi anda atau kandungan skop yang anda tulis. Sebagai contoh, anda mungkin ingin menulis lebih banyak ujian gaya unit untuk skop. Sebagai alternatif, anda mungkin ingin menulis lebih banyak ujian gaya integrasi yang menguji skop dalam konteks seperti pengawal. </p> <p> Secara peribadi, saya suka mencampurkan kedua -dua supaya saya dapat memastikan bahawa skop itu menambah kekangan yang betul dan skop sebenarnya digunakan dalam pertanyaan. </p> <p> mari kita mulakan dengan contoh sebelumnya <code>published</code> dan <code>notPublished</code> julat dan tulis beberapa ujian untuk mereka. Kita perlu menulis dua ujian yang berbeza (satu untuk setiap julat): </p> <ul> <li> pemeriksaan ujian <code>published</code> pulangan pelbagai hanya artikel yang diterbitkan. </li> <li> Pemeriksaan ujian <code>notPublished</code> Pulangan jarak hanya artikel yang tidak diterbitkan. </li> </ul> <p> mari kita lihat ujian ini dan kemudian bincangkan apa yang sedang dilakukan: </p> <pre class="brush:php;toolbar:false"><code>use App\Models\Article; $publishedPosts = Article::query() ->where('published_at', '<', now()) ->get();</code></pre> <p> kita dapat melihat dalam fail ujian di atas, kita mula -mula membuat beberapa data dalam kaedah <code>setUp</code>. Kami telah mencipta dua artikel yang diterbitkan, satu artikel yang tidak berjadual dan satu artikel yang diatur. </p> <p> maka terdapat ujian (<st>) yang memeriksa julat <code>only_published_articles_are_returned</code> untuk mengembalikan hanya artikel yang diterbitkan. Terdapat juga ujian (<code>published</code>) yang memeriksa julat <code>only_not_published_articles_are_returned</code> untuk mengembalikan hanya artikel yang tidak diterbitkan. <code>notPublished</code> </st></p> Dengan melakukan ini, kami kini boleh memastikan bahawa skop pertanyaan kami menggunakan kekangan seperti yang diharapkan. <p> </p> julat ujian dalam pengawal <h1> </h1> <hr> Seperti yang telah kami sebutkan, cara lain untuk menguji skop pertanyaan adalah untuk menguji mereka dalam konteks yang digunakan dalam pengawal. Walaupun ujian pengasingan skop dapat membantu menegaskan bahawa skop menambah kekangan yang betul kepada pertanyaan, ia tidak benar -benar menguji sama ada skop digunakan dalam permohonan seperti yang diharapkan. Sebagai contoh, anda mungkin lupa untuk menambah julat <p> ke pertanyaan dalam kaedah pengawal. <code>published</code> </p> Jenis -jenis kesilapan ini boleh ditangkap dengan menulis ujian yang menegaskan bahawa mengembalikan data yang betul apabila menggunakan skop dalam kaedah pengawal. <p> </p> Mari kita ambil contoh mempunyai aplikasi blog multi-penyewa dan tulis ujian untuk kaedah pengawal yang menyenaraikan artikel. Mari kita anggap kita mempunyai kaedah pengawal yang sangat mudah, seperti berikut: <p> </p> <pre class="brush:php;toolbar:false"><code>use App\Models\Article; use Illuminate\Contracts\Database\Eloquent\Builder; $unpublishedPosts = Article::query() ->where(function (Builder $query): void { $query->whereNull('published_at') ->orWhere('published_at', '>', now()); }) ->get();</code></pre> Kami mengandaikan bahawa model <p> telah menggunakan <code>AppModelsArticle</code> kami. <code>AppModelsScopesTeamScope</code> </p> kami akan menegaskan bahawa kami hanya mengembalikan artikel yang tergolong dalam pasukan pengguna. Kes ujian mungkin kelihatan seperti ini: <p> </p> <pre class="brush:php;toolbar:false"><code>declare(strict_types=1); namespace App\Models; use Illuminate\Contracts\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; final class Article extends Model { public function scopePublished(Builder $query): Builder { return $query->where('published_at', '<', now()); } public function scopeNotPublished(Builder $query): Builder { return $query->where(function (Builder $query): Builder { return $query->whereNull('published_at') ->orWhere('published_at', '>', now()); }); } // ... }</code></pre> Dalam ujian di atas, kami mencipta dua pasukan. Kemudian, kami membuat pengguna milik Team One. Kami mencipta 3 artikel untuk pasukan 1 dan 2 artikel untuk Pasukan 2. Kami kemudian bertindak sebagai pengguna dan membuat permintaan kepada kaedah pengawal yang menyenaraikan artikel. Kaedah pengawal harus mengembalikan hanya 3 artikel milik pasukan satu, jadi kami menegaskan bahawa hanya artikel -artikel tersebut dikembalikan dengan membandingkan ID artikel. <p> </p> Ini bermakna kita dapat memastikan bahawa skop pertanyaan global digunakan seperti yang diharapkan dalam kaedah pengawal. <p> </p> Kesimpulan <h1> </h1> <hr> Dalam artikel ini, kami telah belajar tentang skop pertanyaan tempatan dan skop pertanyaan global. Kami mempelajari perbezaan di antara mereka, bagaimana untuk membuat dan menggunakannya, dan bagaimana menulis ujian untuk mereka. <p> </p> Harap anda sekarang dapat menggunakan skop pertanyaan dengan yakin dalam aplikasi Laravel anda. <p></p>

Atas ialah kandungan terperinci Belajar menguasai skop pertanyaan di laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn