Rumah >rangka kerja php >YII >Bagaimanakah saya bekerja dengan pangkalan data relasi di Yii (satu-ke-banyak, banyak-banyak)?
Artikel ini menerangkan bagaimana Orm Yii memudahkan mengendalikan hubungan pangkalan data satu-ke-banyak dan banyak. Ia memperincikan menentukan hubungan menggunakan Activerecord, efisien pertanyaan dengan pemuatan dan penapisan yang bersemangat, dan amalan terbaik untuk operasi crud
YII menyediakan mapper-relasi objek yang teguh (ORM) yang dipanggil GII yang memudahkan bekerja dengan pangkalan data relasi, terutama ketika berurusan dengan hubungan satu-ke-banyak dan banyak. Hubungan ini ditakrifkan dalam kelas model anda menggunakan Activerecord.
Hubungan Satu-ke-Banyak: Ini mewakili satu senario di mana satu rekod dalam jadual boleh dikaitkan dengan pelbagai rekod dalam jadual lain. Sebagai contoh, model Author
mungkin mempunyai banyak model Book
. Anda menentukan ini dalam model Author
anda menggunakan kaedah hasMany()
:
<code class="php"><?php namespace app\models; use Yii; use yii\db\ActiveRecord; class Author extends ActiveRecord { public static function tableName() { return 'authors'; } public function getBooks() { return $this->hasMany(Book::className(), ['author_id' => 'id']); } }</code>
Dalam contoh ini, getBooks()
mentakrifkan hubungan. Book::className()
Menentukan model yang berkaitan, dan ['author_id' => 'id']
memaparkan kunci author_id
dalam jadual books
ke kunci utama id
dalam jadual authors
. Sekarang, anda boleh mengakses buku pengarang seperti ini: $author->books
.
Ramai-ke-banyak hubungan: Ini mewakili satu senario di mana rekod dalam satu jadual boleh dikaitkan dengan pelbagai rekod dalam jadual lain, dan sebaliknya. Sebagai contoh, model Student
mungkin didaftarkan dalam banyak model Course
, dan model Course
mungkin mempunyai banyak model Student
. Ini memerlukan jadual persimpangan (misalnya, student_course
) untuk menghubungkan kedua -dua jadual.
<code class="php"><?php namespace app\models; use Yii; use yii\db\ActiveRecord; class Student extends ActiveRecord { public static function tableName() { return 'students'; } public function getCourses() { return $this->hasMany(Course::className(), ['id' => 'course_id']) ->viaTable('student_course', ['student_id' => 'id']); } } <?php namespace app\models; use Yii; use yii\db\ActiveRecord; class Course extends ActiveRecord { public static function tableName() { return 'courses'; } public function getStudents() { return $this->hasMany(Student::className(), ['id' => 'student_id']) ->viaTable('student_course', ['course_id' => 'id']); } }</code>
Di sini, viaTable()
menentukan jadual persimpangan dan pemetaan kunci asing. Anda boleh mengakses kursus pelajar menggunakan $student->courses
dan pelajar kursus menggunakan $course->students
.
getBooks()
, getCourses()
) dan memastikan pemetaan kunci asing yang tepat.with()
) yang bersemangat untuk mengambil data yang berkaitan dalam pertanyaan tunggal. Sebagai contoh: $author = Author::findOne(1)->with('books')->one();
Ini mengambil semula pengarang dan buku mereka dalam satu pertanyaan pangkalan data.Ciri -ciri pertanyaan yang cekap memanfaatkan ciri -ciri Activerecord Yii dan teknik pengoptimuman pangkalan data.
with()
adalah penting untuk mengelakkan pertanyaan N 1. Ini meningkatkan prestasi dengan ketara apabila mengambil data yang berkaitan.where()
dan kaedah bangunan pertanyaan lain untuk menapis data yang berkaitan. Sebagai contoh, untuk mendapatkan buku pengarang yang diterbitkan selepas tarikh tertentu: $author->books()->where(['>', 'publication_date', '2023-01-01'])->all();
CRUD (membuat, membaca, mengemas kini, memadam) operasi pada data yang berkaitan memerlukan pengendalian yang teliti untuk mengekalkan konsistensi data.
author_id
.with()
) untuk mendapatkan data yang berkaitan dengan cekap.deleteAll()
atau berhati -hati mengendalikan proses penghapusan dalam urus niaga untuk mengelakkan ketidakkonsistenan data.Ingatlah untuk menyesuaikan contoh -contoh ini untuk memadankan jadual dan nama model khusus anda. Sentiasa menguji kod anda dengan teliti untuk memastikan integriti dan prestasi data.
Atas ialah kandungan terperinci Bagaimanakah saya bekerja dengan pangkalan data relasi di Yii (satu-ke-banyak, banyak-banyak)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!