Rumah >rangka kerja php >ThinkPHP >Bagaimanakah saya bekerja dengan hubungan (satu-ke-banyak, banyak-banyak) dalam model ThinkPHP?
ThinkPhp's Orm (Object-Relational Pemetaan) menyediakan cara yang mudah untuk menangani hubungan pangkalan data, memudahkan interaksi antara kod PHP anda dan pangkalan data anda. Untuk hubungan satu-ke-banyak, anda menentukan hubungan dalam model anda di mana satu rekod dalam jadual boleh dikaitkan dengan pelbagai rekod dalam jadual lain. Sebagai contoh, model pengguna mungkin mempunyai hubungan satu-ke-banyak dengan model post
, di mana satu pengguna boleh mempunyai banyak jawatan. Anda menentukan hubungan ini dalam model pengguna
anda menggunakan hasmany ()
kaedah. Sintaks kelihatan seperti ini:
<code class="php"> & lt ;? php namespace app \ model; Gunakan berfikir \ model; Pengguna kelas meluaskan model {post fungsi awam () {return $ this- & gt; hasmany ('post', 'user_id', 'id'); }} </code>
Kod ini menetapkan hubungan hasmany
. 'pos'
Menentukan model yang berkaitan, 'user_id'
adalah kunci asing dalam jadual post
merujuk jadual user
, dan 'id'
adalah kunci utama pengguna
. Untuk mengakses catatan yang berkaitan, anda boleh menggunakan kaedah ()
pada user
object:
<code class="php"> $ user = user :: cari (1); $ posts = $ user- & gt; posts; // Mengakses semua jawatan yang berkaitan dengan pengguna. foreach ($ posts as $ post) {echo $ post- & gt; tajuk. & quot; & lt; br & gt; & quot ;; } </code>
Hubungan banyak-ke-banyak sedikit lebih kompleks. Mereka memerlukan meja gabungan. Katakan anda mempunyai model dan role , di mana pengguna boleh mempunyai pelbagai peranan dan peranan boleh diberikan kepada beberapa pengguna. Anda akan memerlukan user_role
JOIN TABLE dengan user_id
dan role_id
columns. Dalam pengguna
model anda:
<code class="php"> & lt ;? php namespace app \ model; Gunakan berfikir \ model; Pengguna kelas meluaskan model {peranan fungsi awam () {return $ this- & gt; kepunyaan ('peranan', 'user_role', 'user_id', 'role_id'); }} </code>
Begitu juga, dalam peranan anda
model:
<code class="php"> & lt ;? php namespace app \ model; Gunakan berfikir \ model; Peranan kelas memanjangkan model {pengguna fungsi awam () {return $ this- & gt; milikStomany ('user', 'user_role', 'role_id', 'user_id'); }} </code> <p> Hujah kedua ialah nama jadual Join, hujah -hujah ketiga dan keempat adalah kunci asing dalam jadual gabungan. Mengakses peranan yang berkaitan dilakukan sama: </p> <pre class="brush:php;toolbar:false"> <code class="php"> $ user = user :: find (1); $ peranan = $ user- & gt; peranan; // Mengakses semua peranan yang berkaitan dengan pengguna. foreach ($ roles as $ role) {echo $ role- & gt; name. & quot; & lt; br & gt; & quot ;; } </code>
Pengurusan Hubungan Pangkalan Data yang Berkesan dalam ThinkPhp bergantung kepada beberapa amalan terbaik:
dengan ()
) apabila mungkin untuk mendapatkan data yang berkaitan dalam satu pertanyaan. Ini memastikan integriti data. Ini menghalang kemas kini separa sekiranya berlaku kegagalan. dengan ()
kaedah, adalah penting untuk mengelakkan masalah N 1. Daripada membuat pertanyaan berasingan untuk setiap rekod yang berkaitan, pemuatan yang bersemangat mengambil semua data yang berkaitan dalam satu pertanyaan. <code class="php"> $ users = user :: with ('posts')-& gt; pilih (); // Posting beban yang bersemangat untuk semua pengguna foreach ($ pengguna sebagai pengguna $) {foreach ($ user- & gt; posts as $ post) {echo $ post- & gt; tajuk. & quot; & lt; br & gt; & quot ;; }} </code> // beban bersemangat hanya diterbitkan siaran
anda juga boleh menggunakan gabungan secara langsung dalam pertanyaan anda untuk lebih banyak kawalan:
<code class="php"> $ users = user :: alias ('u') -& gt; -& gt; pilih (); </code>
Daripada menulis pertanyaan SQL mentah, anda boleh menggunakan kaedah hubungan ORM untuk mengendalikan kerumitan dengan elegan untuk menyertai dan mengambil data merentasi pelbagai jadual. Ini meningkatkan kebolehbacaan kod, penyelenggaraan, dan mengurangkan risiko kelemahan suntikan SQL.
Sebagai contoh, pertimbangkan untuk mengambil pengguna dengan jawatan dan komen yang berkaitan. Anda boleh mencapai ini dengan mengikat hubungan:
<code class="php"> // asumsi pos mempunyai hubungan hasmany dengan komen $ users = user :: with ('poss' = & gt; function ($ query) {$ query- & gt; dengan ('komen');})-& gt; foreach ($ pengguna sebagai $ user) {foreach ($ user- & gt; posts as $ post) {echo $ post- & gt; tajuk. & quot; & lt; br & gt; & quot ;; foreach ($ post- & gt; komen sebagai $ komen) {echo $ comment- & gt; content. & quot; & lt; br & gt; & quot ;; }}} </code>
Ini mengelakkan keperluan untuk pelbagai gabungan dalam pertanyaan SQL mentah, menjadikan kod bersih dan lebih mudah difahami. Orm ThinkPhp mengendalikan SQL yang mendasari bergabung dengan telus, membolehkan anda memberi tumpuan kepada logik permohonan anda dan bukannya selok -belok SQL. Ini meningkatkan kecekapan pembangunan dan mengurangkan kemungkinan kesilapan.
Atas ialah kandungan terperinci Bagaimanakah saya bekerja dengan hubungan (satu-ke-banyak, banyak-banyak) dalam model ThinkPHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!