Dàimhean polymorphic le Laravel Eloquent, mar a mhìnicheas tu iad agus eisimpleirean

dàimhean polymorphic laravel eloquent

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 ArticleVideo 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

Autore