简单、好用的php 集成开发环境 Xserver

eloquent模型关联关系——一对一

所有的orm框架都会在代码层描述数据库结构,比如ef(entity framework)的实体类和edmx文件,java的注解实体类等,laravel中是通过实体类来描述数据库结构(或者说表之间的关联关系)。

Eloquent 中表的关联关系以方法的方式描述。本文我们先看如何通过定义方法的方式来描述表之间的关联关系,然后再讲解关联关系的使用方法。 

如何描述一对一关联关系

在描述一对一的关系之前需要理解一个【拥有】【属于】的关系,这个关系是eloquent描述一切表关联关系的基础,这个道理其实很简单,但是很容易被忽略。

我们一般将外键放到被拥有的一方,比如user和phone两个表,假如一个人只有一个电话的话,我们一般会通过在phone表中创建user_id来关联二者关系,即:user拥有phone,phone属于user。

理解拥有和属于的概念之后我们可以很容易描述二者关系。

在user类中创建phone()方法, 此方法返回一个HasOne对象。hasOne方法理解重点为

在phone类中可以创建belongsTo方法,此方法返回一个BelongsTo对象。此方法理解终点为:

注意

  1. 用来描述关联关系的方法名不能和类的字段名重复,否则将导致变量名歧义,eloquent将无法判定其代表一个字段还是一个关联关系。
  2. 关联关系的命名需要严格描述单复数。否则将极大降低代码可读性,一对一个关系中描述关联关系的方法名都是单数,比如上面例子中的phone方法和user方法。
  3. 尽量使用默认的风格创建字段名,hasOne和belongsTo方法的后两个参数尽量使用使用默认值。这样可以减少字符串的使用场景,提高系统安全性。

如何使用一对一关系

如同 Eloquent 模型本身,关联也可以作为强大的 查询构造器 使用,提供了强大的链式调用和查询功能。定义关联模型之后,可以使用动态属性访问关联对象。

$phone = User::find(1)->phone; 

注意

使用ide-helper可以自动生成关联关系的字段名的phpDocs,避免phostorm不识别字段名,导致没有代码自动完成和黄色波浪线以及警告。

总结

本节实际只是介绍了两个方法的使用,hasOne和belongsTo。这两个方法非常简单,但是要做到完全理解,还是有不少细节需要理解到位。看起来简单,实际要做到用起来得心应手还是需要下一番功夫。

热门评论

  • lxbfYeaa
    e
  • lxbfYeaa
    e