在lavaral中可以直接使用DB查询构建器写sql关联语句,其实挺方便,程序执行效率也会更高。ORM主要应该使用于关联查询比较多的情景。
在lavaral中可以直接使用DB查询构建器写sql关联语句,其实挺方便,程序执行效率也会更高。ORM主要应该使用于关联查询比较多的情景。
一、简介
laravel当中主要有以下几种关联关系:
- 一对一
- 一对多
- 多对多
- 远程一对多
- 多态关联
- 多对多的多态关联
主要是前3种关联用的多。返回的数据是集合类型。
二、定义关联关系
简单定义使用
在模型中定义一个函数,比如:
class Users extends Base
{
protected $table = 'blog_admin';
protected $dateFormat = 'U';
/**
* 关联模型
* 属于该用户的身份。
*/
public function roles()
{
return $this->belongsToMany('App\Models\Admin\Role','blog_admin_role','admin_id','role_id');
}
}
使用:按正常查询数据,然后在后面跟上roles属性就行了。需要注意的是,必须是单条记录才能直接使用roles属性。
$data->roles;
多条记录需要遍历:
foreach($data as $v){
$v->roles;
}
关联关系
每种关联关系都有正向关联和反向关联
1. 一对一
正向:
$this->hasOne('要关联的模型名','foreign_key','local_key');
反向:
$this->belongsTo('要关联的模型名','local_key','foreign_key');
foreign_key:关联模型名对应的外键
local_key:本模型被关联的ID
2.一对多
正向:
$this->hasMany('要关联的模型名','foreign_key','local_key');
反向:
$this->belongsTo('要关联的模型名','local_key','foreign_key');
foreign_key:关联模型名对应的外键
local_key:本模型被关联的ID
比如:一个分类对应多篇文章,一个文章只属于一个分类,我在文章模型中定义
正向关联:
/**
* 关联模型
* 属于该文章的分类。
*/
public function cat()
{
return $this->hasMany('App\Models\Admin\Cat','id','cat_id');
}
反向关联:
/**
* 关联模型
* 属于该文章的分类。
*/
public function cat()
{
return $this->belongsTo('App\Models\Admin\Cat','cat_id','id');
}
总结来说,第一个参数就是外键,无论正向反向关联,这里填写数据表中的外键即可
3. 多对多
比如一个管理员和角色多对多,中间表明为blog_admin_role,可以这样定义:
/**
* 关联模型
* 属于该用户的身份。
*/
public function roles()
{
return $this->belongsToMany('App\Models\Admin\Role','blog_admin_role','admin_id','role_id');
}
三、插入 & 更新关联模型
插入关联模型
首先需要获取到模型,比如,添加一片文章,然后添加标签
添加文章
$this_article = $this->create($data);
添加标签
$this_article->tag()->attach($tags_id);
移除关联模型
获取文章
$this_article = $this->find($id);
移除标签
$this_article->tag()->detach($tags_id);
更新关联模型
$this_article->tag()->sync($tags_id);
sync方法会接受一组数据,他会保存新添加的数据,移除删除掉的数据。
以上便是简单使用orm后,自己的一些理解。
----更新(2017/12/24)
多对多添加更新中间表
当多对多中间表需要添加额外字段,可以这样做
$this_article->tag()->attach($tags_id,['key'=>$value]);
或者将$tags_id改造成以下格式(假如额外字段位tag_val)
[ '1'=>['tag_val'=>'tag_1'],
'2'=>['tag_val'=>'tag_2']
]
参考:
http://laravelacademy.org/post/6996.html
– END