Rumah > rangka kerja php > YII > teks badan

Perhubungan model dalam rangka kerja Yii: melaksanakan perkaitan data

WBOY
Lepaskan: 2023-06-21 10:10:46
asal
1051 orang telah melayarinya

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']);
    }
}
Salin selepas log masuk
Salin selepas log masuk

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:

  1. Perkaitan satu-ke-banyak (mempunyaiMany)

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']);
    }
}
Salin selepas log masuk

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.

  1. Perkaitan satu-ke-banyak dengan berbilang persatuan (mempunyai Banyak melalui)

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');
    }
}
Salin selepas log masuk

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).

  1. Persatuan satu dengan satu (hasOne)

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']);
    }
}
Salin selepas log masuk
Salin selepas log masuk

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.

  1. Persatuan banyak-ke-banyak (mempunyaiMany)

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']);
    }
}
Salin selepas log masuk

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;
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!