Dalam rangka kerja Yii, hubungan model ialah konsep yang sangat penting, digunakan untuk mencapai perkaitan data antara berbilang jadual data. Dengan mentakrifkan perhubungan perkaitan, data berkaitan boleh diperoleh secara langsung apabila menanyakan data, sekali gus mengurangkan kerumitan pertanyaan dan meningkatkan kecekapan pertanyaan data. Artikel ini akan memperkenalkan perhubungan model dalam rangka kerja Yii secara terperinci, termasuk cara mentakrifkan perhubungan, jenis perhubungan yang berbeza dan cara menggunakan perhubungan untuk menanyakan data.
1. Tentukan perhubungan perkaitan
Dalam rangka kerja Yii, perkaitan data antara jadual data boleh dicapai dengan mentakrifkan perkaitan dalam kelas model. Secara khusus, satu atau lebih kaedah awam ditakrifkan dalam kelas model Kaedah ini menerangkan perkaitan antara jadual data dan jadual data lain dengan memanggil satu siri kaedah perkaitan yang disediakan oleh rangka kerja Yii. Berikut ialah contoh mudah:
class Order extends ActiveRecord { public function getCustomer() { return $this->hasOne(Customer::className(), ['id' => 'customer_id']); } }
Dalam contoh di atas, kami menentukan kaedah perkaitan getCustomer() untuk menerangkan perkaitan antara jadual pesanan (Pesanan) dan jadual pelanggan (Pelanggan). Khususnya, kami menggunakan kaedah hasOne yang disediakan oleh rangka kerja Yii, yang mewakili perhubungan satu-dengan-satu sehala, iaitu, hanya terdapat seorang pelanggan untuk pesanan. Antaranya, parameter pertama menentukan nama kelas model yang berkaitan, dan parameter kedua menentukan hubungan yang sepadan antara kunci asing yang berkaitan dan kunci primer. Dalam contoh ini, medan customer_id dalam jadual pesanan sepadan dengan medan id dalam jadual pelanggan.
2. Jenis persatuan yang berbeza
Selain kaedah hasOne, rangka kerja Yii juga menyediakan beberapa jenis persatuan lain untuk melaksanakan kaedah persatuan data yang berbeza. Berikut adalah jenis yang biasa digunakan:
Perkaitan satu-ke-banyak bermakna satu kelas model dikaitkan dengan berbilang model kelas dari jenis yang sama. Dalam kaedah persatuan, ia boleh ditakrifkan menggunakan kaedah hasMany.
class Order extends ActiveRecord { public function getOrderItems() { return $this->hasMany(OrderItem::className(), ['order_id' => 'id']); } }
Dalam kod di atas, kami menentukan hubungan antara berbilang kelas model OrderItem dalam kelas model Pesanan, yang dilaksanakan melalui kaedah hasMany. Antaranya, parameter pertama menentukan nama kelas model yang berkaitan, dan parameter kedua menentukan hubungan yang sepadan antara kunci asing yang berkaitan dan kunci primer. Dalam contoh ini, medan id dalam jadual pesanan sepadan dengan medan order_id dalam jadual item pesanan.
Perkaitan jenis ini menunjukkan bahawa terdapat jadual perkaitan perantaraan antara dua kelas model, dan setiap Setiap kelas model mempunyai berbilang rekod yang dikaitkan dengan jadual persatuan perantaraan. Dalam kaedah persatuan, ia boleh ditakrifkan menggunakan kaedah hasMany.
class Order extends ActiveRecord { public function getOrderItems() { return $this->hasMany(OrderItem::className(), ['order_id' => 'id']); } public function getProducts() { return $this->hasMany(Product::className(), ['id' => 'product_id']) ->via('orderItems'); } }
Dalam kod di atas, kami menentukan hubungan antara berbilang kelas model Produk dalam kelas model Pesanan, yang dilaksanakan melalui kaedah hasMany. Antaranya, parameter pertama menentukan nama kelas model yang berkaitan, dan parameter kedua menentukan hubungan yang sepadan antara kunci asing yang berkaitan dan kunci primer. Dengan memanggil kaedah melalui('orderItems'), kami menyatakan bahawa jadual perkaitan perantaraan OrderItem perlu digunakan dalam perkaitan, bukannya secara langsung menggunakan perkaitan antara jadual pesanan (Pesanan) dan jadual produk (Produk).
Persatuan satu dengan satu menunjukkan bahawa terdapat perkaitan satu-dengan-satu sehala antara dua model kelas. Dalam kaedah persatuan, ia boleh ditakrifkan menggunakan kaedah hasOne.
class Order extends ActiveRecord { public function getCustomer() { return $this->hasOne(Customer::className(), ['id' => 'customer_id']); } }
Dalam kod di atas, kami menentukan hubungan perkaitan antara kelas model Pesanan dan kelas model Pelanggan, yang dilaksanakan melalui kaedah hasOne. Antaranya, parameter pertama menentukan nama kelas model yang berkaitan, dan parameter kedua menentukan hubungan yang sepadan antara kunci asing yang berkaitan dan kunci primer.
Persatuan banyak-ke-banyak menunjukkan bahawa terdapat perkaitan banyak-ke-banyak dwiarah antara dua kelas model. Dalam kaedah persatuan, ia boleh ditakrifkan menggunakan kaedah hasMany.
class Order extends ActiveRecord { public function getProducts() { return $this->hasMany(Product::className(), ['id' => 'product_id']) ->viaTable('order_item', ['order_id' => 'id']); } }
Dalam kod di atas, kami menentukan hubungan antara berbilang kelas model Produk dalam kelas model Pesanan, yang dilaksanakan melalui kaedah hasMany. Antaranya, parameter pertama menentukan nama kelas model yang berkaitan, dan parameter kedua menentukan hubungan yang sepadan antara kunci asing yang berkaitan dan kunci primer. Dengan memanggil kaedah viaTable('order_item', ['order_id' => 'id']), kami menyatakan bahawa jadual perkaitan perantaraan order_item perlu digunakan dalam perkaitan.
3. Data pertanyaan menggunakan perkaitan
Dengan mentakrifkan perkaitan, kami boleh menggunakan kaedah ActiveRecord yang disediakan oleh rangka kerja Yii untuk melengkapkan pertanyaan data yang sepadan. Berikut ialah contoh mudah:
$order = Order::findOne(1); $customer = $order->customer;
Dalam kod di atas, kami mula-mula menggunakan kaedah findOne untuk menanyakan rekod pesanan dengan id 1, dan kemudian mendapatkan maklumat pelanggan yang sepadan dengan pesanan melalui kaedah persatuan.
Selain mengakses secara langsung kaedah yang berkaitan, kami juga boleh menggunakan kaedah dengan untuk pramuat data yang berkaitan, dengan itu mengurangkan keperluan untuk menanya pangkalan data beberapa kali.
$orders = Order::find()->with('customer')->all(); foreach ($orders as $order) { echo $order->customer->name; }
Dalam kod di atas, kami mula-mula menggunakan kaedah cari untuk menanyakan semua rekod pesanan dan pramuat maklumat pelanggan yang dikaitkan dengan pesanan dengan memanggil kaedah with('customer'). Dengan cara ini, dalam gelung foreach berikutnya, setiap kali maklumat pelanggan pesanan itu diakses, ia boleh diperolehi terus daripada memori tanpa menanyakan pangkalan data lagi.
Ringkasan
Artikel ini terutamanya memperkenalkan perhubungan model dalam rangka kerja Yii, termasuk cara mentakrifkan perhubungan, jenis perhubungan yang berbeza dan cara menggunakan perhubungan untuk menanyakan data. Dengan menggunakan perhubungan model secara rasional, kami boleh meningkatkan kecekapan pertanyaan data dan menjadikan kod program lebih ringkas dan boleh dibaca.
Atas ialah kandungan terperinci Perhubungan model dalam rangka kerja Yii: melaksanakan perkaitan data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!