Rumah  >  Artikel  >  rangka kerja php  >  Penjelasan terperinci tentang fungsi korelasi pertanyaan ThinkPHP

Penjelasan terperinci tentang fungsi korelasi pertanyaan ThinkPHP

PHPz
PHPzasal
2023-04-11 10:30:151995semak imbas

Dengan pembangunan berterusan pembangunan web, korelasi pertanyaan telah menjadi keperluan yang sangat biasa. Banyak rangka kerja juga menyediakan antara muka korelasi pertanyaan yang mudah. ThinkPHP ialah rangka kerja PHP yang sangat popular Ia menyediakan fungsi korelasi pertanyaan yang berkuasa dan boleh memenuhi pelbagai keperluan pembangun. Artikel ini akan menerangkan secara terperinci fungsi korelasi pertanyaan ThinkPHP.

1. Perkaitan model

1.1 Perkaitan satu dengan satu

Perkaitan satu dengan satu bermakna hanya terdapat satu rekod dalam setiap dua jadual data. Dalam kes ini, gunakan fungsi hasOne() dan belongTo () untuk mengaitkan. Katakan kita mempunyai dua jadual, satu jadual pengguna dan satu lagi jadual info pengguna Struktur kedua-dua jadual adalah seperti berikut:

user:
id
name

userinfo:
id
user_id
age

Dua jadual di atas berkaitan melalui field user_id. Kami kini ingin mencari maklumat pengguna dalam jadual pengguna dan umur pengguna Operasi khusus 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 = [&#39;age&#39;];

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 atribut $readonly Atribut $readonly ialah atribut yang disediakan oleh ThinkPHP Ia 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 ( ' pesanan.barang') bermaksud menanyakan semua Pesanan dan maklumat Barang berkaitan Pesanannya pada masa yang sama.

2. Perkaitan pertanyaan

2.1 Menggunakan pertanyaan perkaitan

Selain mentakrifkan perhubungan perkaitan di peringkat model, kita juga boleh melaksanakan perkaitan dengan memanggil atribut perkaitan bagi pertanyaan 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 apabila menanyakan model, kami 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 membuat pertanyaan secara automatik perkaitan secara lalai, tetapi Pertanyaan akan menunggu sehingga kita menggunakan perhubungan perkaitan.

2.3 Mengandungi Persatuan

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.

Di atas ialah cara menggunakan korelasi pertanyaan ThinkPHP. Fungsi korelasi pertanyaan ThinkPHP sangat berkuasa dan boleh memenuhi kebanyakan keperluan pembangunan.

Atas ialah kandungan terperinci Penjelasan terperinci tentang fungsi korelasi pertanyaan ThinkPHP. 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