多態(tài)關(guān)聯(lián)應(yīng)用場景是當(dāng)多個(gè)表同時(shí)有一個(gè)字段需求時(shí)設(shè)定的碉输,比如:
video 視頻表 :視頻文件,視頻評(píng)論
essay 文章表:文章內(nèi)容亭珍,文章評(píng)論
這倆個(gè)表都有評(píng)論這個(gè)字段敷钾,為了更好的查數(shù)據(jù),多態(tài)關(guān)聯(lián)可以更好的處理數(shù)據(jù)
數(shù)據(jù)表結(jié)構(gòu)#
多態(tài)關(guān)聯(lián)允許一個(gè)模型在單個(gè)關(guān)聯(lián)上屬于多個(gè)其他模型肄梨。例如阻荒,想象一下使用您應(yīng)用的用戶可以「評(píng)論」文章和視頻。使用多態(tài)關(guān)聯(lián)众羡,您可以用一個(gè)?comments?表同時(shí)滿足這兩個(gè)使用場景侨赡。讓我們來看看構(gòu)建這種關(guān)聯(lián)所需的數(shù)據(jù)表結(jié)構(gòu):
posts? ? id-integer? ? title-string? ? body-textvideos? ? id-integer? ? title-string? ? url-stringcomments? ? id-integer? ? body-text? ? commentable_id-integer? ? commentable_type-string
comments?表中有兩個(gè)需要注意的重要字段?commentable_id?和?commentable_type。commentable_id?用來保存文章或者視頻的 ID 值粱侣,而?commentable_type?用來保存所屬模型的類名羊壹。commentable_type?是在我們?cè)L問?commentable?關(guān)聯(lián)時(shí), 讓 ORM 確定所屬的模型是哪個(gè)「類型」齐婴。
模型結(jié)構(gòu)#
接下來油猫,我們來看看創(chuàng)建這種關(guān)聯(lián)所需的模型定義:
? ? * 獲得擁有此評(píng)論的模型。
? ? */publicfunctioncommentable(){return$this->morphTo();}}classPostextendsModel{/**
? ? * 獲得此文章的所有評(píng)論柠偶。
? ? */publicfunctioncomments(){return$this->morphMany('App\Comment','commentable');}}classVideoextendsModel{/**
? ? * 獲得此視頻的所有評(píng)論情妖。
? ? */publicfunctioncomments(){return$this->morphMany('App\Comment','commentable');}}
獲取多態(tài)關(guān)聯(lián)#
一旦您的數(shù)據(jù)庫表準(zhǔn)備好、模型定義完成后嚣州,就可以通過模型來訪問關(guān)聯(lián)了鲫售。例如共螺,我們只要簡單地使用?comments動(dòng)態(tài)屬性该肴,就可以獲得某篇文章下的所有評(píng)論:
$post=App\Post::find(1);foreach($post->commentsas$comment){ //}
插入多態(tài)關(guān)聯(lián)數(shù)據(jù)
$post=App\Post::find(1)->create(['comment'=>'要插入的數(shù)據(jù)']);