Dàimhean polymorphic le Laravel Eloquent, mar a mhìnicheas tu iad agus eisimpleirean
Le dàimhean polymorphic tha iad nan seòrsa de dhàimh eadar buidhnean dàta, a leigeas leat modal dàta a cheangal ri grunn mhodalan dàta air aon chomann.
Tha seo gu h-àraid feumail nuair a tha ceanglaichean gu iomadh clàr ann an clàr.
Feuch gum faic sinn mar a làimhsicheas tu dàimhean polymorphic le Gu deas le Laravel.
Ùine leughaidh tuairmseach: 7 minuti
Duilgheadas
Ann an dealbhadh agus rianachd a stòr-dàta, uaireannan thig sinn tarsainn air suidheachaidhean taobh a-muigh nan gnàthasan àbhaisteach de stòr-dàta dàimheil. Mar eisimpleir, nuair a dh'fheumas sinn aon bhòrd a cheangal ri iomadh clàr, is dòcha gun coinnich sinn ri cuid dàimhean polymorphic. San artaigil seo nì sinn sgrùdadh nas doimhne air a’ bhun-bheachd de dàimh polymorphic, mar a chuireas tu an gnìomh e gu grinn agus gu sònraichte ciamar Eloquent di Laravel gar cuideachadh le bhith a’ sìmpleachadh leasachadh.
Scenario Eisimpleir
Osbarr feumaidh sinn siostam riaghlaidh susbaint a chuir an gnìomh, ris an canar gu tric Siostam Riaghladh Susbaint. Feumaidh an siostam seo beachdan a riaghladh airson diofar sheòrsaichean susbaint: artaigilean, bhideothan agus ìomhaighean. Tha gach aon de na seòrsaichean susbaint sin air a stòradh na chlàr fhèin anns an stòr-dàta, mar sin bidh sinn a 'toirt aghaidh air an duilgheadas a leanas:
Clàran “beachdan” gun fheum
Às aonais dàimhean polymorphic, tha e coltach gum biodh tu a’ cleachdadh bùird air leth a chruthachadh airson beachdan co-cheangailte ri gach seòrsa susbaint. Bhiodh seo mar thoradh air iomadachadh de chlàran mar article_comments
, video_comments
e image_comments
.
Faodaidh riaghladh agus cumail suas na clàran sin a bhith iom-fhillte mar a bhios an CMS a’ nochdadh. Gun a bhith a 'toirt iomradh air iom-fhillteachd nan ceistean agus an còd.
Gus an duilgheadas seo fhuasgladh, faodaidh dà fhuasgladh a bhith againn:
- no cuir a-rithist am feart co-roinnte grunn thursan anns gach clàr. A bhios a trom-laighe a h-uile uair a bu chòir dhuinn beachdan a chur ris;
- No cruthaichidh sinn sàr bhòrd ris an canar
Comments
far am bi thu a’ stòradh a h-uile buadhan co-cheangailte agus an uairsin a’ cruthachadh fo-chlàran airson gach seòrsa.
Mar a tha dàimhean polymorphic a 'fuasgladh na duilgheadas
Gu bunaiteach, tha dàimh polymorphic a’ toirt cothrom dhut aon bhòrd a cheangal ri ioma bùird. Bheir seo sùbailteachd dhut agus leigidh e leat bùird fa leth a chruthachadh airson gach seòrsa comainn. An àite sin, faodaidh tu aon bhòrd a chleachdadh gus comainn a riaghladh gu dinamach.
A’ tilleadh chun eisimpleir CMS: le a dàimh polymorphic, is urrainn dhuinn clàr bheachdan a chruthachadh a ghabhas ceangal ri artaigilean, bhideothan agus ìomhaighean, tha e an urra ris an t-susbaint a chaidh a thoirt seachad. Mar sin tha an dàimhean polymorphic leigidh iad leinn cuir às do chlàran nach eil feum.
Feuch sinn a-nis dè na h-innealan a th 'ann Eloquent a’ toirt cothrom dhuinn am faidhle a chuir an gnìomh dàimhean polymorphic.
Mar a tha dàimhean polymorphic ag obair
Tha polymorphism a’ leigeil le clàr mapadh gu iomadh clàr a’ cleachdadh dà fheart sònraichte, an seòrsa agus an aithnichear: type
e id
.
Tha na raointean sin air an cleachdadh gus am fiosrachadh a tha a dhìth a stòradh gus an seòrsa clàr co-cheangailte agus an aithnichear sònraichte a chomharrachadh (mar as trice am prìomh iuchair). Anns an eisimpleir tha sinn gu bhith a’ sgrùdadh tuilleadh:
- seòrsa_iomradh: a’ stòradh an seòrsa teamplaid co-cheangailte (“Artaigil” no “Bhidio”);
- iomradh_id tha an ID co-fhreagarrach aige.
Mar as trice bidh cleachdadh dàta leughaidh bho chomainn polymorphic a’ toirt a-steach cleachdadh Co-aoinn. Anns a 'chùis againn bidh an JOIN a' tighinn còmhla ris a 'bhòrd comments
leis a’ chlàr-innse co-fhreagarrach a rèir seòrsa_iomradh e iomradh_id . Leigidh seo leat faighinn gu dàta gu h-èifeachdach thar diofar mhodalan.
An ceist SQL a leigeas leinn na beachdan agus na h-artaigilean co-cheangailte ris fhaighinn air ais:
SELECT c.*, a.title AS article_title
FROM comments c
JOIN articles a ON c.commentable_type = 'Article' AND c.commentable_id = a.id;
A’ cheist a leanas airson beachdan co-cheangailte ri bhideothan a leughadh:
SELECT c.*, v.title AS video_title BHO beachdan c Thig còmhla ri bhideothan v ON c.commentable_type = 'Video' AGUS c.commentable_id = v.id;
Cur an gnìomh le Laravel Eloquent
Ann an Laravel, tha Eloquent a’ toirt seachad innealan air leth freagarrach airson obrachadh leotha dàimhean polymorphic. Seo stiùireadh ceum air cheum airson an cur an gnìomh:
Rachamaid air ais chun mhodail Comment
a dh’ fhaodadh a bhith co-cheangailte ri diofar sheòrsaichean susbaint leithid Article
, Video
e Image
.
Chì sinn an rèiteachadh ceum air cheum ceangal polymorphic:
Cruthachadh imrich bùird
An toiseach, feumaidh sinn na faidhlichean imrich gus na clàran a chruthachadh stòr-dàta riatanach. Seo mar a chruthaicheas tu iad migration
airson nan trì bùird:
php artisan make:migration create_articles_table
php artisan make:migration create_videos_table
php artisan make:migration create_comments_table
Am faidhle migration
airson a' bhùird comments
feumaidh raointean a bhith air am mìneachadh mar a leanas
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->text('body');
$table->unsignedBigInteger('commentable_id');
$table->string('commentable_type');
$table->timestamps();
});
}
Às deidh dhut na bùird a chruthachadh leis an òrdugh a leanas:
php artisan migrate
Cruthaichidh sinn na modalan Beachd, Artaigil, Bhidio agus Ìomhaigh
php artisan make:model Article
php artisan make:model Video
php artisan make:model Image
php artisan make:model Comment
An dòigh morphTo()
air a chleachdadh anns a 'mhodail a bhios co-cheangailte ris na modalan eile ann an dòigh polymorphic. A’ leigeil leat am modail co-cheangailte fhaighinn air ais gun a bhith a’ sònrachadh an dearbh sheòrsa. Sìmplidh am pròiseas a bhith ag obair le dàimhean polymorphic.
class Comment extends Model
{
use HasFactory;
public function commentable(){
return $this->morphTo();
}
}
Gu h-ìosal tha an model Article
class Article extends Model
{
use HasFactory;
public function comments(){
return $this->morphMany(Comment::class, 'commentable');
}
}
Gu h-ìosal tha an model Video
class Video extends Model
{
use HasFactory;
public function comments(){
return $this->morphMany(Comment::class, 'commentable');
}
}
Gu h-ìosal tha an model Image
class Image extends Model
{
use HasFactory;
public function comments(){
return $this->morphMany(Comment::class, 'commentable');
}
}
An dòigh morphMany()
air a chleachdadh airson mìneachadh a dàimh polymorphic aon gu mòran air modail. Leigidh e leat grunn chlàran co-cheangailte fhaighinn air ais bho dhiofar mhodalan gu glan agus gu h-èifeachdach. Tha e air a chleachdadh gu tric nuair a dh'fhaodar modail a cheangal ri grunn sheòrsaichean de mhodailean co-cheangailte.
Dàimh Polymorphic aon-ri-aon
A ' cruthachadh templates
Cruthaichidh sinn dhà modail gus dàimh polymorphic aon-ri-aon a riochdachadh, bidh sinn ag obair le modail Comment
agus modail Image
.
php artisan make:model Comment
php artisan make:model Image
Sònraich an dàimh
Nel modail Comment
, bidh sinn a 'stèidheachadh an dàimh polymorphic aon-ri-aon leis a' mhodail Image
cruthachadh dòigh-obrach image
. Tha an dòigh seo a 'cleachdadh an dàimh eloquent
morphOne
// app/models/Comment.php
public function image()
{
return $this->morphOne(Image::class, 'imageable');
}
Nel modail Image
, bidh sinn a’ mìneachadh cùl an dàimh le bhith a’ cruthachadh dòigh imageable
. Tha an dòigh seo a 'cleachdadh an dàimh morphTo
di Eloquent
:
// app/models/Image.php
public function imageable()
{
return $this->morphTo();
}
Cruthachadh agus leughadh
Faodaidh tu a-nis fiosrachadh a chruthachadh agus a leughadh a’ cleachdadh an dàimh polymorphic aon-ri-aon. Seo mar as urrainn dhuinn ìomhaigh a cheangal ri beachd:
// Create a comment
$comment = new Comment(['text' => 'A beautiful realistic image.']);
$comment->save();
// Create an image for the comment
$image = new Image(['url' => 'https://bloginnovazione.it/virtual-reality.jpg']);
$comment->image()->save($image);
Gus dealbh co-cheangailte ri beachd a leughadh:
$comment = Comment::find(1);
$image = $comment->image;
Ag ùrachadh agus a’ sguabadh às clàran
Tha e sìmplidh ùrachadh agus cuir às do chlàran co-cheangailte tro chàirdeas polymorphic. Gus URL ìomhaigh ùrachadh:
$image = Image::find(1);
$image->update(['url' => 'https://bloginnovazione.it/new-virtual-reality.jpg']);
Gus dealbh a sguabadh às:
$image = Image::find(1);
$image->delete();
Dàimh polymorphic aon-gu-iomadach
Bithear a’ cleachdadh dàimh polymorphic aon-ri-iomadh nuair a bhuineas modal dàta do bharrachd air aon mhodail eile air aon mhodail comainn. Mar eisimpleir, ma tha clàran de phuist is bhideothan againn, feumaidh an dithis siostam beachd a chuir ris.
A ' cruthachadh templates
Cruthaichidh sinn trì modail Gus dàimh polymorphic aon-gu-iomadh a riochdachadh, bidh sinn ag obair le modail Comment
, samhail Post
agus modail Image
.
php artisan make:model Comment
php artisan make:model Image
php artisan make:model Post
Sònraich an dàimh
Nel modail Comment
, bidh sinn a 'stèidheachadh an dàimh polymorphic aon-gu-iomadach leis a' mhodail Image
agus am modail Post
. Tha an dòigh seo a 'cleachdadh an dàimh eloquent
morphTo
, agus a’ leasachadh a rèir an t-seòrsa eintiteas air a bheil am beachd a’ toirt iomradh: Image
o Post
.
// app/models/Comment.php
class Comment extends Model
{
/**
* Get all of the owning commentable models.
*/
public function commentable()
{
return $this->morphTo();
}
}
Nel modail Image
, bidh sinn a’ mìneachadh cùl an dàimh le bhith a’ cruthachadh dòigh comments
. Tha an dòigh seo a 'cleachdadh an dàimh morphMany
di Eloquent
:
// app/models/Image.php
class Image extends Model
{
/**
* Get all of the image's comments.
*/
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
}
Fiù 's anns a' mhodail Post
, bidh sinn a’ mìneachadh cùl an dàimh le bhith a’ cruthachadh dòigh comments
. Tha an dòigh seo a 'cleachdadh an dàimh morphMany
di Eloquent
:
// app/models/Post.php
class Post extends Model
{
/**
* Get all of the post's comments.
*/
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
}
Cruthachadh agus leughadh
Faodaidh tu a-nis fiosrachadh a chruthachadh agus a leughadh a’ cleachdadh an dàimh polymorphic aon-ri-aon. Seo mar as urrainn dhuinn ìomhaigh a cheangal ri beachd:
// Find a Post and Create a comment
$post = Post::find(1);
$comment = new Comment;
$comment->body = "Hi, Here we are bloginnovazione.it";
$post->comments()->save($comment);
// Find an Image and Create a comment
$image = Image::find(1);
$comment = new Comment;
$comment->body = "Hi, Here we are bloginnovazione.it";
$image->comments()->save($comment);
Nam biodh sinn airson grunn bheachdan a sgrìobhadh aig an aon àm:
// Create an image
$image = new Image(['url' => 'https://bloginnovazione.it/image.jpg']);
$image->save();
// Create a post
$post = new Post(['url' => 'https://bloginnovazione.it/post']);
$post->save();
// Add comments to the image
$image->comments()->createMany([
['text' => 'Beautiful image!'],
['text' => 'I love this picture.'],
]);
// Add comments to the post
$post->comments()->createMany([
['text' => 'Great post!'],
['text' => 'Well done.'],
]);
Gus a h-uile beachd co-cheangailte ri ìomhaigh no post a leughadh:
// find a post and print comments
$post = Post::find(1);
dd($post->comments);
// find an image and print comments
$image = Image::find(1);
dd($image->comments);
Ag ùrachadh agus a’ sguabadh às clàran
Tha e sìmplidh ùrachadh agus cuir às do chlàran co-cheangailte tro chàirdeas polymorphic. Gus URL ìomhaigh ùrachadh:
$comment = Comment::find(1);
$comment->update(['text' => 'Absolutely amazing!']);
Gus beachd a sguabadh às:
$comment = Comment::find(1);
$comment->delete();
Leughaidhean Co-cheangailte
Ercole Palmeri