首页 > 代码库 > laravel model relationship

laravel model relationship

laravel支持多种模型之间的relation,对应着模型间的one2one, one2many,many2many,hasManyThrough,Polymorphic, many2many polymorphic关系。

心法

1.所有relation都由model class上的方法来定义;

2. relationship和model本身都是以query builder作为基类的,因此对relation的操作也可以使用类似query builder的方法,比如:可以支持级联;

3.Dynamic property of model:这是 model->relation方式引用的结果,这种方式直接返回relation model的value,不支持query builder的级联操作,这是和model->relation()方法调用的本质区别。

也就是说model->relation = model->relation()->get()

关系的种类:

one 2 one(一对一)

例子User hasOne Phone, Phone belongsTo User这种关系。要使得这种关系work,则需要以下前提:

1. User模型

base table: users,

字段预设: id

relation method: phone (){ return $this->hasOne(‘App\Phone‘) }

 

注意:按照laravel的命名规约,laravel会假设phones表中有一个user_id字段作为users表中的id外键,

我们可以通过在user()方法中传入另外的参数来覆盖这种规约,比如$this->hasOne(‘App\Phone‘,‘owner_id‘)

在这里owner_id就是phones表中外键引用users表的id的字段名称(默认为user_id);

 

2.Phone模型

base table: phones,

字段预设: user_id

relation method: user(){ return $this->belongsTo(‘App\User‘)}

在这里,laravel也会预设parent表(也就是users表)中有一个id字段为primary key,如果你的parent表并不是使用id作为主键,则在上面的hasOne调用中,可以使用第三个参数来指定这个主键,比如

user(){return $this->hasOne(‘App\User‘,‘owner_id‘,‘u_id‘}. 这里owner_id为phones表中对users表主键(u_id)的外键引用字段名称

One 2 Many(一对多)

例子: Post hasMany Comments, Comment belongsTo Post,这就是典型的一对多关系模型

1. Post模型

base table: posts

字段预设:id标示行主键

relation method: comments(){return $this->hasMany(‘App\Comment‘)}

如果需要覆盖默认命名规约,我们需要这样调用:

public function comments(){return $this->hasMany(‘App\Comment‘,‘foreign_owner_postid_key‘,‘local_postid_key‘)}

注意这里:foreign_owner_postid_key就是要在comments表中具有的字段名;

local_postid_key就是posts本表中必须具有的主键字段名

2. Comment模型

base table: comments

字段预设: post_id 作为posts表的外键

relation method: post(){return $this->belongsTo(‘App\Post‘)}

如果需要覆盖默认命名规约,同样我们需要这样调用:

public function post(){return $this->belongsTo(‘App\Post‘,‘foreign_owner_postid_key‘,‘other_local_postid_key‘}

注意:这里foreign_owner_postid_key就是在本comments表中必须具有的引用posts表的外键字段名;

other_local_postid_key就是必须在posts表中具有的主键名称。之所以加local,other就是代表的是本表的还是关联表的。

 

另外,上面也已经提到由于relationship本身就是query builder因此可以增加约束级联,比如:

Post::find(1)->comments()->where(‘title‘,‘foo‘)->first()就只取title为foo的第一条post对应的comment

 

other_local_postid_key就是

注意按照laravel默认命名规约,一对多的关系模型,child model中的owning model

laravel model relationship