Laravel5.1模型关联知识(Eloquent: Relationships)

  • 项目的数据库部分昨晚晓乐已经微信视频和我讲了近一个小时,小叮租书项目的后台使用laravel开发接口和业务逻辑部分,前台部分是由海洋大学一位大二的前端学生在做。这个项目数据表很多,大体上分为了product,order和乱七八糟的er-common部分。

  • 项目涉及到的实体比较多,昨天另一个PHPer把数据表全部migration写完push上去了,担心我不会今天的API-Model怎么写,晓乐还特意写了Role和Permission部分。然后,我也确实不会写,一开始都不知道到底要写啥,等讲完一小时的数据表才知道:原来是要我写模型里面实体间的对应关系

  • 没办法咯,看官方的英文文档的Eloquent: Relationships部分咯。文档指出实体之间的关系有七种(六种:一对多和多对一可以理解为一种):
一对一 
一对多
多对一
多对多
远程一对多
多态关联
多态多对多关联
  • 使用模型关联之前,我们要先定义每个实体关系的类型。

  • 首先创建一个继承了Eloquent/Model类的User Model,根据项目ER图找出和用户实体有关系的实体:role角色permission权限school学校enrollmentInfo学籍orders订单coupons优惠券addresses地址carts购物车,除了和实体的关系,User Model还应该定义一些用于获取id,token信息的函数。

  • 为啥上面的实体一些是单数一些是复数呢?这就是laravel所谓的约定大于配置。用户和其他实体之间的关系决定了User类中关系函数的单复数形式。比如说用户和订单的关系,一个用户可以下多个订单,一个订单之恩那个属于一个用户,所以他们之间是一对多的关系,使用Eloquent内置的hasMany函数表明相对关联:

public function orders()
{
        return $this->hasMany('App\Entities\Order');
}
  • 那么现在的重点就是两个:表明相对关联的Eloquent内置函数有哪些?请看https://cs.laravel-china.org/#eloquent 。千万不要和Laravel内置的辅助函数(帮助函数,助手函数,Helpers函数)搞混哦,简单用法如下。
// 一对一 - User::phone()
 return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
// 一对一 - Phone::user(), 定义相对的关联
 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区分一下)。其他的四个是用来认证授权的一些内容,这个项目的认证授权使用第三方包JWT,有空我得了解一下。

  • 然后就是User Model实现接口AuthenticatableContract和AuthorizableContract(其实我也不太清楚这接口在哪里定义的,为什么要这样写),接着开始定义一些配置,比如:

    1. 表名不是默认的名词+s形式,则需要指定$table。
    2. 如果表中不存在created_at和updated_at,需要将timestamp指定为false,即关闭自动维护时间戳。
    3. 按照情况添加guarded数组,如created_at等。
    4. 如果存在deleted_at,为model添加softdelete 的trait。(写文章时候这一点我还不理解)
      5.对于外键不是【表名单数】_id这样形式的,需要在指定关系时,显性指定键名,如address表中的province_id指向areas,就需要单独指定。
  • 对比项目User.php和上面的函数你会发现hasOne()还能带参数,也是定义配置里面的重新定义外键,因为默认情况下外键名称是基于Model名称的。包括第三个参数,具体请看:http://d.laravel-china.org/docs/5.1/eloquent-relationships

  • 除此之外这个文件中海油获取user_id的getAuthIdentifier(),获取user_password的getAuthPassword()和静态的addUser()。

  • 实际上这个部分不仅仅写模型关联这么简单,还有获取数据,更新删除数据的方法,Model相关的内容包括基础用法更多用法软删除模型关联事件Eloquent配置信息

  • 那么我就联系了另一个工作三年的PHPer,问下他写了哪些实体关系,我就开始写咯,要写的如下:

Account  账户
Address  地址
Cart  购物车
Category  分类
College  大学
Coupon  优惠券
EnrollmentInfo  学籍信息
EnrollmentUnit  学籍单位
Entity  相当于Eloquent/Model,这里所有实体的父类
Inventory  库存
Item  商品
Major  学生主修专业
Order  订单
OrderAddition  订单辅表
OrderHistory  历史订单
OrderItem  订单商品表
Payment  付款方式
PaymentRecord  付款记录
Permission  权限,william wei写完了。
    - 多对多roles
Product  产品
ProductAttr  产品属性
ProductAttrValue  产品属性值
Role  角色,william wei写完了。
    - 多对多users,多对多permissions
School  学校
Shipping  配送方式
StockOutRecord 出库记录
Tag  标签
User  用户,william wei写完了。
    - 一对多school,一对一EnrollmentInfo,多对多Role,
    - 一对多orders,多对多coupons,一对多addresses,一对多carts
Warehourse  仓库
  • 注意,一对多和多对一概念类似但是函数名单复数不一致哦。学生对学校是一对多,使用school();学校对学生是多多对一,使用students()。

  • 使用belongsTo时可能是一对一,也可能是一对多。

  • 上面有少数是实体之间的联系表,考虑到适度增加冗余于是给该表增加字段作为实体操作,例如:product。

  • 怎么查看本地和远程代码的区别呢,使用git diff命令咯(zsh下默认别用gd),但是需要自己指定参数哦,常见参数有:

git diff test 查看本地当前分支与本地test分支的区别
git diff test 查看本地当前分支与远程test分支的区别
git diff dev master 查看本地dev分支与远程master分支的区别
git diff pull test 查看下次提交到远程dev分支时出变化的内容

这个部分git命令没写好以后继续添加,并追加到以前的Git命令学习文章中。另外下篇文章就是我单独把上面所有实体关联写完的烧脑过程,对着ER图一直想,一个XXX可以有YYY个ZZZ,但是一个ZZZ只能有YYY个个XXX,所以这个N对M模型,然后对照速查表写关联函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容