


Pengenalan semula hubungan polimorfik yang fasih ' s
mata teras
- Persatuan Polymorphic Laravel membolehkan model menjadi milik pelbagai model lain pada satu persatuan. Ini memudahkan struktur pangkalan data, menjadikan kod lebih mudah untuk mengekalkan, dan membolehkan hubungan data yang lebih dinamik dan fleksibel.
- Menyediakan persatuan polimorfik di Laravel melibatkan persatuan yang menentukan dalam model fasih. Kaedah
- digunakan untuk menerima model yang berkaitan dengan polimorfik, manakala kaedah
morphTo
ataumorphMany
digunakan untuk model yang berkaitan dengan model lain.morphOne
Kaedah -
MorphMap
Laravel menyokong banyak hubungan polimorfik, yang membolehkan model menjadi milik pelbagai model secara banyak. Ini amat berguna dalam aplikasi yang kompleks.
Anda mungkin telah menggunakan pelbagai jenis hubungan antara model atau jadual pangkalan data, seperti biasa di Laravel: satu-satu, satu-ke-banyak, banyak-banyak, dan mempunyai banyak. Tetapi terdapat satu lagi jenis yang kurang biasa: persatuan polimorfik. Jadi apakah persatuan polimorfik?
Persatuan Polymorphic merujuk kepada model yang boleh dimiliki oleh beberapa model lain dalam satu persatuan.
apa yang akan kita binaUntuk menggambarkan ini, mari kita buat adegan fiksyen di mana kita mempunyai topik dan model pos. Pengguna boleh meninggalkan komen dalam topik dan jawatan. Menggunakan hubungan polimorfik, kita boleh menggunakan jadual komen tunggal untuk kedua -dua kes. Menghairankan, bukan? Ini seolah -olah agak tidak praktikal kerana idealnya kita perlu membuat jadual Post_Comments dan jadual Topic_comments untuk membezakan komen. Menggunakan hubungan polimorfik, kami tidak memerlukan dua jadual. Mari memahami hubungan polimorfik melalui contoh praktikal.
kami akan membuat aplikasi muzik demo yang mengandungi lagu dan album. Dalam aplikasi ini, kami boleh menyukai lagu dan album. Menggunakan hubungan polimorfik, kami akan menggunakan jadual Upvotes tunggal untuk kedua -dua kes. Pertama, mari kita periksa struktur jadual yang diperlukan untuk membina hubungan ini:
mari kita bincangkan lajur
dan<code>albums id - integer name - string songs id - integer title - string album_id - integer upvotes id - integer upvoteable_id - integer upvoteable_type - string </code>
akan mengandungi nilai ID album atau lagu, manakala lajur upvoteable_id
akan mengandungi nama kelas yang memiliki model. Lajur upvoteable_type
adalah bagaimana ORM menentukan "jenis" mana yang akan kembali memiliki model apabila mengakses hubungan upvoteable_id
. upvoteable_type
menghasilkan model dan penghijrahan
Saya menganggap anda sudah mempunyai aplikasi Laravel yang sedang berjalan. Jika tidak, kursus permulaan cepat ini boleh membantu. Mari kita mulakan tiga model dan migrasi, dan kemudian mengedit migrasi untuk memenuhi keperluan kita.
<code>albums id - integer name - string songs id - integer title - string album_id - integer upvotes id - integer upvoteable_id - integer upvoteable_type - string </code>
Perhatikan bahawa lulus bendera -m
apabila membuat model juga akan menghasilkan migrasi yang berkaitan dengan model -model ini. Mari kita laraskan kaedah up
dalam migrasi ini untuk mendapatkan struktur meja yang dikehendaki:
{some_timestamp}_create_albums_table.php
<code>php artisan make:model Album -m php artisan make:model Song -m php artisan make:model Upvote -m </code>
{some_timestamp}_create_songs_table.php
public function up() { Schema::create('albums', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); }
{some_timestamp}_create_upvotes_table.php
Sekarang, kita boleh menjalankan perintah migrasi tukang untuk membuat ketiga -tiga jadual ini:
public function up() { Schema::create('songs', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->integer('album_id')->unsigned()->index(); $table->timestamps(); $table->foreign('album_id')->references('id')->on('albums')->onDelete('cascade'); }); }
mari kita konfigurasikan model kami untuk memberi perhatian kepada hubungan polimorfik antara album, lagu dan suka:
public function up() { Schema::create('upvotes', function (Blueprint $table) { $table->increments('id'); $table->morphs('upvoteable'); // 添加无符号整数 upvoteable_id 和字符串 upvoteable_type $table->timestamps(); }); }
app/Upvote.php
<code>php artisan migrate</code>
app/Album.php
Kaedah
[...] class Upvote extends Model { /** * 获取所有拥有模型。 */ public function upvoteable() { return $this->morphTo(); } }
app/Song.php
Selepas menentukan hubungan, kita kini boleh mencuba permohonan untuk lebih memahami bagaimana hubungan polimorfik berfungsi. Kami tidak akan membuat sebarang pandangan untuk aplikasi ini, kami hanya akan mencuba aplikasi kami dari konsol.
class Album extends Model { protected $fillable = ['name']; public function songs() { return $this->hasMany(Song::class); } public function upvotes() { return $this->morphMany(Upvote::class, 'upvoteable'); } }
upvotes
mari kita mulakan konsol:
Hubungan pengambilan semula
Sekarang bahawa kami mempunyai beberapa data siap, kami dapat mengakses hubungan kami melalui model kami. Berikut adalah tangkapan skrin data dalam jadual upvotes:
class Song extends Model { protected $fillable = ['title', 'album_id']; public function album() { return $this->belongsTo(Album::class); } public function upvotes() { return $this->morphMany(Upvote::class, 'upvoteable'); } }
untuk mengakses semua album seperti ini, kita boleh menggunakan
atribut dinamik:
juga boleh mengambil pemilik hubungan polimorfik dari model polimorfik dengan mengakses nama kaedah yang melakukan panggilan ke . Dalam kes kita, itu adalah kaedah
upvotes
Hubungan
<code>php artisan tinker >>> $album = App\Album::create(['name' => 'More Life']); >>> $song = App\Song::create(['title' => 'Free smoke', 'album_id' => 1]); >>> $upvote1 = new App\Upvote; >>> $upvote2 = new App\Upvote; >>> $upvote3 = new App\Upvote; >>> $album->upvotes()->save($upvote1); >>> $song->upvotes()->save($upvote2); >>> $album->upvotes()->save($upvote3);</code>
Kerana kita boleh mendapatkan bilangan suka untuk lagu atau album, kita boleh menyusun lagu atau album berdasarkan The Likes on the View. Begitulah carta muzik berfungsi.
untuk lagu, kita akan suka seperti ini:
<code>albums id - integer name - string songs id - integer title - string album_id - integer upvotes id - integer upvoteable_id - integer upvoteable_type - string </code>
Jenis polimorfik adat
Secara lalai, Laravel akan menggunakan nama kelas yang berkelayakan sepenuhnya untuk menyimpan jenis model yang berkaitan. Sebagai contoh, dalam contoh di atas, Upvote mungkin tergolong dalam album atau lagu, dan lalai upvoteable_type
adalah App\Album
atau App\Song
masing -masing.
)? Ini bermakna kita perlu menetapkan panjang maksimum yang sangat panjang pada lajur. Di sinilah kaedah App\Models\Data\Topics\Something\SomethingElse
dapat membantu kami. MorphMap
<code>php artisan make:model Album -m php artisan make:model Song -m php artisan make:model Upvote -m </code>
public function up() { Schema::create('albums', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); }
Kesimpulan
Walaupun anda mungkin tidak pernah menghadapi situasi di mana anda perlu menggunakan hubungan polimorfik, hari itu akhirnya akan datang. Kelebihan menggunakan Laravel adalah bahawa pengendalian keadaan ini sangat mudah dan tidak perlu melakukan apa -apa trik persatuan model untuk mendapatkan sesuatu yang berfungsi. Laravel juga menyokong banyak hubungan polimorfik. Anda boleh membaca lebih lanjut mengenainya di sini.
Saya harap anda kini memahami hubungan polimorfik dan apa yang mungkin diperlukan untuk jenis hubungan ini. Satu lagi contoh hubungan polimorfik yang lebih maju ada di sini. Jika anda mendapati ini membantu, sila kongsi dengan rakan anda dan jangan lupa untuk klik butang seperti itu. Jangan ragu untuk meninggalkan pemikiran anda di bahagian komen di bawah!
Soalan Lazim Mengenai Hubungan Polymorphic Eloquent
Apakah faedah menggunakan hubungan polimorfik di Laravel?
Hubungan polimorfik di Laravel menyediakan cara yang fleksibel dan cekap untuk memproses data yang berkaitan antara model yang berbeza. Mereka membenarkan model tergolong dalam pelbagai jenis model lain dalam satu persatuan. Ini bermakna anda boleh mempunyai satu senarai pengecam unik semua data yang berkaitan tanpa mengira jenis mereka. Ini dapat memudahkan struktur pangkalan data anda dan menjadikan kod anda lebih mudah untuk dijaga. Ia juga membolehkan hubungan data yang lebih dinamik dan fleksibel, yang amat berguna dalam aplikasi kompleks.
Bagaimana untuk menetapkan hubungan polimorfik di Laravel?
Menubuhkan hubungan polimorfik di Laravel melibatkan hubungan yang menentukan dalam model fasih. Pertama, anda perlu menentukan hubungan pada model yang akan menerima hubungan polimorfik. Ini dilakukan menggunakan kaedah morphTo
. Kemudian, pada model yang akan dikaitkan dengan model lain, gunakan kaedah morphMany
atau morphOne
mengikut sama ada hubungan itu adalah satu-ke-banyak atau satu.
Bolehkah anda memberikan contoh hubungan polimorfik di Laravel?
Sudah tentu, mari kita pertimbangkan platform blog di mana kedua -dua jawatan dan pengguna boleh mempunyai komen. Dalam kes ini, model komen akan mempunyai hubungan polimorfik dengan model pos dan pengguna. Inilah cara untuk menentukan hubungan ini:
<code>albums id - integer name - string songs id - integer title - string album_id - integer upvotes id - integer upvoteable_id - integer upvoteable_type - string </code>
Bagaimana menggunakan hubungan polimorfik untuk mendapatkan rekod yang berkaitan?
Anda boleh mendapatkan rekod yang relevan dalam hubungan polimorfik seperti yang anda lakukan dengan hubungan fasih yang lain. Sebagai contoh, jika anda ingin mengambil semua komen dari siaran, anda boleh melakukan ini:
<code>php artisan make:model Album -m php artisan make:model Song -m php artisan make:model Upvote -m </code>
Bagaimana untuk menyelamatkan rekod yang berkaitan menggunakan hubungan polimorfik?
Simpan rekod yang berkaitan dalam hubungan polimorfik juga serupa dengan hubungan fasih yang lain. Anda boleh mengaitkan model menggunakan kaedah associate
dan menyimpan model. Berikut adalah contoh:
public function up() { Schema::create('albums', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); }
Apakah beberapa kes penggunaan biasa untuk hubungan polimorfik?
Hubungan polimorfik amat berguna dalam situasi di mana model boleh tergolong dalam pelbagai jenis model lain. Sesetengah kes penggunaan biasa termasuk komen yang boleh dimiliki oleh jawatan dan pengguna, tag yang boleh digunakan untuk pelbagai jenis kandungan, dan imej atau fail yang boleh dilampirkan kepada pelbagai jenis entiti.
Apakah batasan atau kelemahan menggunakan hubungan polimorfik?
Walaupun hubungan polimorfik memberikan banyak fleksibiliti, mereka juga mungkin lebih kompleks dan lebih sukar untuk ditubuhkan dan dikendalikan daripada hubungan fasih standard. Mereka juga menyokong semua ciri hubungan standard, seperti keinginan untuk memuatkan kekangan.
Bagaimana untuk memadam rekod yang relevan dalam hubungan polimorfik?
anda boleh menggunakan kaedah delete
pada hubungan untuk memadam rekod yang relevan dalam hubungan polimorfik. Sebagai contoh, untuk memadam semua komen dari siaran, anda boleh melakukan ini:
public function up() { Schema::create('songs', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->integer('album_id')->unsigned()->index(); $table->timestamps(); $table->foreign('album_id')->references('id')->on('albums')->onDelete('cascade'); }); }
Bolehkah saya menggunakan hubungan polimorfik dengan banyak hubungan?
Ya, Laravel menyokong banyak hubungan polimorfik melalui kaedah morphToMany
dan morphedByMany
. Ini membolehkan model menjadi milik pelbagai model secara banyak.
Bagaimana menangani hubungan polimorfik dalam penghijrahan pangkalan data?
Dalam penghijrahan pangkalan data, anda biasanya menambah dua lajur ke jadual yang akan menerima hubungan polimorfik: satu untuk ID model yang berkaitan dan yang lain untuk jenis model yang berkaitan. Laravel menyediakan kaedah morphs
yang mudah untuk menambah lajur ini:
public function up() { Schema::create('upvotes', function (Blueprint $table) { $table->increments('id'); $table->morphs('upvoteable'); // 添加无符号整数 upvoteable_id 和字符串 upvoteable_type $table->timestamps(); }); }
Ini menambah commentable_id
dan commentable_type
lajur ke meja.
Atas ialah kandungan terperinci Pengenalan semula hubungan polimorfik yang fasih ' s. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Sesi rampasan boleh dicapai melalui langkah -langkah berikut: 1. Dapatkan ID Sesi, 2. Gunakan ID Sesi, 3. Simpan sesi aktif. Kaedah untuk mengelakkan rampasan sesi dalam PHP termasuk: 1. Gunakan fungsi Sesi_Regenerate_ID () untuk menjana semula ID Sesi, 2. Data sesi stor melalui pangkalan data, 3.

Prinsip reka bentuk Restapi termasuk definisi sumber, reka bentuk URI, penggunaan kaedah HTTP, penggunaan kod status, kawalan versi, dan benci. 1. Sumber harus diwakili oleh kata nama dan dikekalkan pada hierarki. 2. Kaedah HTTP harus mematuhi semantik mereka, seperti GET digunakan untuk mendapatkan sumber. 3. Kod status hendaklah digunakan dengan betul, seperti 404 bermakna sumber tidak wujud. 4. Kawalan versi boleh dilaksanakan melalui URI atau header. 5. Boots Operasi Pelanggan Hateoas melalui pautan sebagai tindak balas.

Dalam PHP, pengendalian pengecualian dicapai melalui percubaan, menangkap, akhirnya, dan membuang kata kunci. 1) blok percubaan mengelilingi kod yang boleh membuang pengecualian; 2) Blok tangkapan mengendalikan pengecualian; 3) Akhirnya Blok memastikan bahawa kod itu sentiasa dilaksanakan; 4) Lemparan digunakan untuk membuang pengecualian secara manual. Mekanisme ini membantu meningkatkan keteguhan dan mengekalkan kod anda.

Fungsi utama kelas tanpa nama dalam PHP adalah untuk membuat objek satu kali. 1. Kelas tanpa nama membenarkan kelas tanpa nama ditakrifkan secara langsung dalam kod, yang sesuai untuk keperluan sementara. 2. Mereka boleh mewarisi kelas atau melaksanakan antara muka untuk meningkatkan fleksibiliti. 3. Beri perhatian kepada prestasi dan kebolehbacaan kod apabila menggunakannya, dan elakkan berulang kali menentukan kelas tanpa nama yang sama.

Dalam PHP, perbezaan antara termasuk, memerlukan, termasuk_once, memerlukan_once adalah: 1) termasuk menghasilkan amaran dan terus melaksanakan, 2) memerlukan menghasilkan ralat maut dan berhenti pelaksanaan, 3) termasuk_once dan memerlukan_once mencegah kemasukan berulang. Pilihan fungsi ini bergantung kepada kepentingan fail dan sama ada perlu untuk mencegah kemasukan pendua. Penggunaan rasional dapat meningkatkan kebolehbacaan dan pemeliharaan kod.

Terdapat empat jenis kesilapan utama dalam PHP: 1.Notice: yang paling sedikit, tidak akan mengganggu program, seperti mengakses pembolehubah yang tidak ditentukan; 2. Amaran: Serius daripada notis, tidak akan menamatkan program, seperti tidak mengandungi fail; 3. FatalError: Yang paling serius, akan menamatkan program ini, seperti tidak memanggil fungsi; 4. ParseError: Kesalahan sintaks, akan menghalang program daripada dilaksanakan, seperti lupa untuk menambah tag akhir.

PHP dan Python masing -masing mempunyai kelebihan mereka sendiri, dan memilih mengikut keperluan projek. 1.PHP sesuai untuk pembangunan web, terutamanya untuk pembangunan pesat dan penyelenggaraan laman web. 2. Python sesuai untuk sains data, pembelajaran mesin dan kecerdasan buatan, dengan sintaks ringkas dan sesuai untuk pemula.
