laravel 模型关联
1、 一对一
所需表:users(用户表)、phone(电话表)
/**
* 获得与用户关联的电话记录。
*/
public function phone()
{
return $this->hasOne(PhoneModel::class,'foreign_key','local_key');
}
ps:一对一, 'A'表与'B'表的关联
2、 定义反向关联(可用户一对多的反向关联)
/**
* 获得拥有此电话的用户。
*/
public function user()
{
return $this->belongsTo(UserModel::class,'foreign_key','owner_key');
}
ps: owner_key:关联模型的键 foreign_key:当前模型的键
个人理解:'一个用户有多个手机号码,但一个号码只属于一个用户,在电话模型关联用户时就可以用反向关联,也可以用一对一关联'
3、 一对多
/**
* 获得此博客文章的评论。
*/
public function comments()
{
return $this->hasMany(CommentModel::class,'foreign_key','local_key');
}
4、 多对多
多对多需要用到三个表: roles、users、role_user
/**
* 获得此用户的角色。
*/
public function roles()
{
return $this->belongsToMany(RoleModel::class,UserRoleModel::class,'user_id','role_id');
}
ps:在UserModel模型中添加此方法
个人理解:'多对多其实就是三个表之间的关联,一般用于用户表、角色表、用户角色表之间的关联'
5、 远程一对多
远程一对多所需的表:users(用户表)、countries(国家表)、post(博客表)
在countries模型中,新建博客关联方法 post()
/**
* 获得某个国家下所有的用户文章。
*/
public function posts()
{
return $this->hasManyThrough(PostModel::class, UsersModel::class,'country_id','user_id','id','id');
}
ps:'country_id':用户表的外键(国家ID) 'user_id':文章表的外键(用户ID) 'id':国家表(当前模型)本地键(ID) 'id':用户表本地键(ID)
个人理解:'A'与'B'有关联、'A'与'C'有关联,'B'与'C'没关联,远程一对多其实就是通过'A'来实现'B'和'C'的查询,
6、 官方文档
https://laravel-china.org/docs/laravel/5.5/eloquent-relationships/1333
7、 whereHas使用
/**
* 关联上级
*/
!empty($data['parent_account']) && $model = $model->whereHas('parentUsers',function ($query) use ($data){
//上级姓名筛选
$query->select()->where('account','like','%'.$data['parent_account'].'%');
});
ps:主要用于在使用模型关联时,关联表的字段作为条件去筛选