項目的數(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(其實我也不太清楚這接口在哪里定義的,為什么要這樣寫)仲义,接著開始定義一些配置婶熬,比如:
- 表名不是默認的名詞+s形式,則需要指定$table埃撵。
- 如果表中不存在created_at和updated_at赵颅,需要將timestamp指定為false,即關(guān)閉自動維護時間戳暂刘。
- 按照情況添加guarded數(shù)組饺谬,如created_at等。
- 如果存在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ù)。