1. Persatuan model
1.1 Persatuan satu sama satu
Persatuan satu dengan satu ialah dua data Terdapat hanya satu rekod dalam setiap jadual Dalam kes ini, fungsi hasOne() dan belongTo() digunakan untuk mengaitkan. Katakan kita mempunyai dua jadual data, satu dipanggil jadual pengguna (jadual pengguna) dan satu lagi jadual maklumat pengguna (jadual info pengguna adalah seperti berikut:
user: id name userinfo: id user_id age
Dua jadual di atas diwakili). mengikut medan user_id dikaitkan. Sekarang kita perlu menanyakan maklumat pengguna dan umur yang sepadan dalam jadual pengguna Langkah-langkahnya adalah seperti berikut:
Tentukan kaedah userinfo() dalam model Pengguna, dengan sebarang nama kaedah.
//User模型 <?php class User extends Model{ public function userinfo(){ return $this -> hasOne('UserInfo', 'user_id'); } }
Tentukan kaedah umur() dalam model Pengguna Kaedah ini sebenarnya mentakrifkan atribut yang mengakses medan umur model info pengguna.
//User模型 <?php class User extends Model{ protected $readonly = ['age']; public function userinfo(){ return $this -> hasOne('UserInfo', 'user_id'); } public function getAgeAttr($value, $data){ if(isset($data['userinfo'])){ return $data['userinfo']['age']; } return ''; } }
Selepas melengkapkan kod di atas, kami boleh menggunakan kaedah find() untuk menanyakan pengguna yang kami mahu dan umur mereka:
//查询user表中id为1的用户 $user = User::get(1); echo $user -> name; echo $user -> age;
Nota: Dalam kod di atas, kami menggunakan $ The readonly atribut, atribut $readonly ialah atribut yang disediakan oleh ThinkPHP, yang boleh melindungi beberapa atribut daripada ditulis ke pangkalan data. Dalam kod di atas, kami menetapkan atribut umur sebagai atribut baca sahaja, supaya apabila $user -> age diakses, kaedah getAgeAttr akan dipanggil secara automatik untuk menanyakan medan umur dalam model info pengguna.
1.2 Perkaitan satu-ke-banyak
Perkaitan satu-ke-banyak bermakna satu daripada dua jadual data mempunyai berbilang rekod dan satu lagi hanya mempunyai satu rekod. Seperti dalam contoh berikut:
order: id user_id order_no order_goods: id order_id name price
Dua jadual di atas berkaitan melalui id_perintah medan. Kami kini perlu mencari maklumat pesanan pengguna dan maklumat produk yang sepadan dalam jadual pengguna Operasi khusus adalah seperti berikut:
Tentukan kaedah pesanan() dalam model Pengguna pesanan.
//User模型 <?php class User extends Model{ public function orders(){ return $this -> hasMany('Order', 'user_id'); } }
Tentukan kaedah barang() dalam model Pesanan Kaedah ini menunjukkan bahawa pesanan mempunyai berbilang produk.
//Order模型 <?php class Order extends Model{ public function goods(){ return $this -> hasMany('OrderGoods', 'order_id'); } }
Selepas mentakrifkan perkaitan di atas, kami boleh menggunakan kaedah find() untuk menanyakan pesanan pengguna dan produk yang sepadan dengan setiap pesanan:
//查询user表中id为1的用户的订单信息和订单的商品信息 $user = User::get(1, 'orders.goods'); var_dump($user -> orders[0] -> goods);
Parameter terakhir ('orders.goods ' ) bermaksud menanyakan semua Pesanan dan maklumat Barang berkaitan Pesanannya pada masa yang sama.
2. Perkaitan pertanyaan
2.1 Menggunakan pertanyaan perkaitan
Kami boleh mengakses atribut perkaitan yang ditakrifkan dalam lapisan model, Laksanakan pertanyaan berkaitan tanpa menentukan perhubungan pada peringkat lapisan model. Sebagai contoh, kami kini ingin menanyakan pengguna dan maklumat pesanannya:
$user = User::get(1); $orders = $user -> orders; echo $user -> name; foreach($orders as $order){ echo $order -> order_no . "\n"; }
2.2 Persatuan Tertunda
Jika kami tidak mahu menanyakan perkaitannya secara automatik semasa membuat pertanyaan model Perhubungan, anda boleh menggunakan korelasi tertunda untuk mencapai keperluan ini. Contohnya:
$user = User::with('orders')->get(1);
Dalam kod di atas, apabila kami menetapkan pembolehubah $user, kami menentukan perkaitan yang akan diperolehi dalam fungsi with() Pada masa ini, pernyataan pertanyaan tidak akan menanyakan perkaitan secara automatik secara lalai, tetapi akan menunggu kami Pertanyaan hanya akan dilakukan apabila menggunakan perhubungan perkaitan.
2.3 Mengandungi perkaitan
Selain perkaitan tertunda di atas, kami juga boleh memasukkan semua perkaitan secara automatik dengan menetapkan parameter sebenar selepas kaedah dengan untuk mencapai keperluan pertanyaan kami . Contohnya:
$user = User::with('orders')->find(1, true);
Dalam kod di atas, kami menambahkan parameter benar pada kaedah find() Parameter ini menunjukkan bahawa kami ingin memasukkan semua perkaitan model pengguna.
Atas ialah kandungan terperinci Cara menggunakan fungsi korelasi pertanyaan ThinkPHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!