Laravel5.1模型關(guān)聯(lián)知識(Eloquent: Relationships)

  • 項目的數(shù)據(jù)庫部分昨晚曉樂已經(jīng)微信視頻和我講了近一個小時庄吼,小叮租書項目的后臺使用laravel開發(fā)接口和業(yè)務(wù)邏輯部分夹攒,前臺部分是由海洋大學(xué)一位大二的前端學(xué)生在做钮蛛。這個項目數(shù)據(jù)表很多,大體上分為了product,order和亂七八糟的er-common部分单默。

  • 項目涉及到的實體比較多,昨天另一個PHPer把數(shù)據(jù)表全部migration寫完push上去了忘瓦,擔心我不會今天的API-Model怎么寫雕凹,曉樂還特意寫了Role和Permission部分。然后政冻,我也確實不會寫,一開始都不知道到底要寫啥线欲,等講完一小時的數(shù)據(jù)表才知道:原來是要我寫模型里面實體間的對應(yīng)關(guān)系明场。

  • 沒辦法咯,看官方的英文文檔的Eloquent: Relationships部分咯李丰。文檔指出實體之間的關(guān)系有七種(六種:一對多和多對一可以理解為一種):
一對一 
一對多
多對一
多對多
遠程一對多
多態(tài)關(guān)聯(lián)
多態(tài)多對多關(guān)聯(lián)
  • 使用模型關(guān)聯(lián)之前苦锨,我們要先定義每個實體關(guān)系的類型。

  • 首先創(chuàng)建一個繼承了Eloquent/Model類的User Model趴泌,根據(jù)項目ER圖找出和用戶實體有關(guān)系的實體:role角色舟舒,permission權(quán)限school學(xué)校嗜憔,enrollmentInfo學(xué)籍秃励,orders訂單coupons優(yōu)惠券吉捶,addresses地址夺鲜,carts購物車皆尔,除了和實體的關(guān)系,User Model還應(yīng)該定義一些用于獲取id币励,token信息的函數(shù)慷蠕。

  • 為啥上面的實體一些是單數(shù)一些是復(fù)數(shù)呢?這就是laravel所謂的約定大于配置食呻。用戶和其他實體之間的關(guān)系決定了User類中關(guān)系函數(shù)的單復(fù)數(shù)形式流炕。比如說用戶和訂單的關(guān)系,一個用戶可以下多個訂單仅胞,一個訂單之恩那個屬于一個用戶每辟,所以他們之間是一對多的關(guān)系,使用Eloquent內(nèi)置的hasMany函數(shù)表明相對關(guān)聯(lián):

public function orders()
{
        return $this->hasMany('App\Entities\Order');
}
  • 那么現(xiàn)在的重點就是兩個:表明相對關(guān)聯(lián)的Eloquent內(nèi)置函數(shù)有哪些饼问?請看https://cs.laravel-china.org/#eloquent 影兽。千萬不要和Laravel內(nèi)置的輔助函數(shù)(幫助函數(shù),助手函數(shù)莱革,Helpers函數(shù))搞混哦峻堰,簡單用法如下。
// 一對一 - User::phone()
 return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
// 一對一 - Phone::user(), 定義相對的關(guān)聯(lián)
 return $this->belongsTo('App\User', 'foreign_key', 'other_key');

// 一對多 - Post::comments()
 return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
//  一對多 - Comment::post()
 return $this->belongsTo('App\Post', 'foreign_key', 'other_key');

// 多對多 - User::roles();
 return $this->belongsToMany('App\Role', 'user_roles', 'user_id', 'role_id');
// 多對多 - Role::users();
 return $this->belongsToMany('App\User');
// 多對多 - Retrieving Intermediate Table Columns
$role->pivot->created_at;
// 多對多 - 中間表字段
 return $this->belongsToMany('App\Role')->withPivot('column1', 'column2');
// 多對多 - 自動維護 created_at 和 updated_at 時間戳
 return $this->belongsToMany('App\Role')->withTimestamps();
  • 那么回過頭來看看這個項目中app/ Entities/目錄下那么多個實體Model(Entities就是個目錄盅视,改成Model也行捐名,但是Entities翻譯過來就是更準確的實體的意思,我一開始還以為是啥厲害的Composer包呢)闹击。我們看看User.php和上面說的有啥不同镶蹋。
首先
  • 首先命名空間和使用緩存,然后是Eloquent的軟刪除(也叫softdelete,惰性刪除赏半,要和惰性加載load區(qū)分一下)贺归。其他的四個是用來認證授權(quán)的一些內(nèi)容,這個項目的認證授權(quán)使用第三方包JWT断箫,有空我得了解一下拂酣。

  • 然后就是User Model實現(xiàn)接口AuthenticatableContract和AuthorizableContract(其實我也不太清楚這接口在哪里定義的,為什么要這樣寫)仲义,接著開始定義一些配置婶熬,比如:

    1. 表名不是默認的名詞+s形式,則需要指定$table埃撵。
    2. 如果表中不存在created_at和updated_at赵颅,需要將timestamp指定為false,即關(guān)閉自動維護時間戳暂刘。
    3. 按照情況添加guarded數(shù)組饺谬,如created_at等。
    4. 如果存在deleted_at谣拣,為model添加softdelete 的trait商蕴。(寫文章時候這一點我還不理解)
      5.對于外鍵不是【表名單數(shù)】_id這樣形式的叠萍,需要在指定關(guān)系時,顯性指定鍵名绪商,如address表中的province_id指向areas苛谷,就需要單獨指定。
  • 對比項目User.php和上面的函數(shù)你會發(fā)現(xiàn)hasOne()還能帶參數(shù)格郁,也是定義配置里面的重新定義外鍵腹殿,因為默認情況下外鍵名稱是基于Model名稱的。包括第三個參數(shù)例书,具體請看:http://d.laravel-china.org/docs/5.1/eloquent-relationships 锣尉。

  • 除此之外這個文件中海油獲取user_id的getAuthIdentifier(),獲取user_password的getAuthPassword()和靜態(tài)的addUser()决采。

  • 實際上這個部分不僅僅寫模型關(guān)聯(lián)這么簡單自沧,還有獲取數(shù)據(jù),更新刪除數(shù)據(jù)的方法树瞭,Model相關(guān)的內(nèi)容包括基礎(chǔ)用法拇厢,更多用法軟刪除晒喷,模型關(guān)聯(lián)孝偎,事件Eloquent配置信息

  • 那么我就聯(lián)系了另一個工作三年的PHPer凉敲,問下他寫了哪些實體關(guān)系衣盾,我就開始寫咯,要寫的如下:

Account  賬戶
Address  地址
Cart  購物車
Category  分類
College  大學(xué)
Coupon  優(yōu)惠券
EnrollmentInfo  學(xué)籍信息
EnrollmentUnit  學(xué)籍單位
Entity  相當于Eloquent/Model爷抓,這里所有實體的父類
Inventory  庫存
Item  商品
Major  學(xué)生主修專業(yè)
Order  訂單
OrderAddition  訂單輔表
OrderHistory  歷史訂單
OrderItem  訂單商品表
Payment  付款方式
PaymentRecord  付款記錄
Permission  權(quán)限势决,william wei寫完了。
    - 多對多roles
Product  產(chǎn)品
ProductAttr  產(chǎn)品屬性
ProductAttrValue  產(chǎn)品屬性值
Role  角色蓝撇,william wei寫完了徽龟。
    - 多對多users,多對多permissions
School  學(xué)校
Shipping  配送方式
StockOutRecord 出庫記錄
Tag  標簽
User  用戶唉地,william wei寫完了。
    - 一對多school传透,一對一EnrollmentInfo耘沼,多對多Role,
    - 一對多orders朱盐,多對多coupons群嗤,一對多addresses,一對多carts
Warehourse  倉庫
  • 注意兵琳,一對多和多對一概念類似但是函數(shù)名單復(fù)數(shù)不一致哦狂秘。學(xué)生對學(xué)校是一對多骇径,使用school();學(xué)校對學(xué)生是多多對一者春,使用students()破衔。

  • 使用belongsTo時可能是一對一,也可能是一對多钱烟。

  • 上面有少數(shù)是實體之間的聯(lián)系表晰筛,考慮到適度增加冗余于是給該表增加字段作為實體操作,例如:product拴袭。

  • 怎么查看本地和遠程代碼的區(qū)別呢读第,使用git diff命令咯(zsh下默認別用gd),但是需要自己指定參數(shù)哦拥刻,常見參數(shù)有:

git diff test 查看本地當前分支與本地test分支的區(qū)別
git diff test 查看本地當前分支與遠程test分支的區(qū)別
git diff dev master 查看本地dev分支與遠程master分支的區(qū)別
git diff pull test 查看下次提交到遠程dev分支時出變化的內(nèi)容

這個部分git命令沒寫好以后繼續(xù)添加怜瞒,并追加到以前的Git命令學(xué)習文章中。另外下篇文章就是我單獨把上面所有實體關(guān)聯(lián)寫完的燒腦過程般哼,對著ER圖一直想吴汪,一個XXX可以有YYY個ZZZ,但是一個ZZZ只能有YYY個個XXX逝她,所以這個N對M模型浇坐,然后對照速查表寫關(guān)聯(lián)函數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末黔宛,一起剝皮案震驚了整個濱河市近刘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌臀晃,老刑警劉巖觉渴,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異徽惋,居然都是意外死亡案淋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門险绘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踢京,“玉大人,你說我怎么就攤上這事宦棺“昃啵” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵代咸,是天一觀的道長蹈丸。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么逻杖? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任奋岁,我火速辦了婚禮,結(jié)果婚禮上荸百,老公的妹妹穿的比我還像新娘闻伶。我一直安慰自己,他們只是感情好管搪,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布虾攻。 她就那樣靜靜地躺著,像睡著了一般更鲁。 火紅的嫁衣襯著肌膚如雪霎箍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天澡为,我揣著相機與錄音漂坏,去河邊找鬼。 笑死媒至,一個胖子當著我的面吹牛顶别,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拒啰,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼驯绎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谋旦?” 一聲冷哼從身側(cè)響起剩失,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎册着,沒想到半個月后拴孤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡甲捏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年演熟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片司顿。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡芒粹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出大溜,到底是詐尸還是另有隱情化漆,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布猎提,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锨苏。R本人自食惡果不足惜疙教,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伞租。 院中可真熱鬧贞谓,春花似錦、人聲如沸葵诈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽作喘。三九已至理疙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泞坦,已是汗流浹背窖贤。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贰锁,地道東北人赃梧。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像豌熄,于是被迫代替她去往敵國和親授嘀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容