laravel Eloquent ORM 模型关联 使用总结

在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

发布了33 篇原创文章 · 获赞 1 · 访问量 8310

猜你喜欢

转载自blog.csdn.net/u012914309/article/details/103417593
今日推荐