laravel 模型關(guān)聯(lián)
1、 一對(duì)一
所需表:users(用戶表)、phone(電話表)
/**
* 獲得與用戶關(guān)聯(lián)的電話記錄。
*/
public function phone()
{
return $this->hasOne(PhoneModel::class,'foreign_key','local_key');
}
ps:一對(duì)一, 'A'表與'B'表的關(guān)聯(lián)
2、 定義反向關(guān)聯(lián)(可用戶一對(duì)多的反向關(guān)聯(lián))
/**
* 獲得擁有此電話的用戶。
*/
public function user()
{
return $this->belongsTo(UserModel::class,'foreign_key','owner_key');
}
ps: owner_key:關(guān)聯(lián)模型的鍵 foreign_key:當(dāng)前模型的鍵
個(gè)人理解:'一個(gè)用戶有多個(gè)手機(jī)號(hào)碼,但一個(gè)號(hào)碼只屬于一個(gè)用戶,在電話模型關(guān)聯(lián)用戶時(shí)就可以用反向關(guān)聯(lián),也可以用一對(duì)一關(guān)聯(lián)'
3、 一對(duì)多
/**
* 獲得此博客文章的評(píng)論。
*/
public function comments()
{
return $this->hasMany(CommentModel::class,'foreign_key','local_key');
}
4、 多對(duì)多
多對(duì)多需要用到三個(gè)表: roles、users、role_user
/**
* 獲得此用戶的角色。
*/
public function roles()
{
return $this->belongsToMany(RoleModel::class,UserRoleModel::class,'user_id','role_id');
}
ps:在UserModel模型中添加此方法
個(gè)人理解:'多對(duì)多其實(shí)就是三個(gè)表之間的關(guān)聯(lián),一般用于用戶表、角色表、用戶角色表之間的關(guān)聯(lián)'
5、 遠(yuǎn)程一對(duì)多
遠(yuǎn)程一對(duì)多所需的表:users(用戶表)、countries(國家表)、post(博客表)
在countries模型中,新建博客關(guān)聯(lián)方法 post()
/**
* 獲得某個(gè)國家下所有的用戶文章。
*/
public function posts()
{
return $this->hasManyThrough(PostModel::class, UsersModel::class,'country_id','user_id','id','id');
}
ps:'country_id':用戶表的外鍵(國家ID) 'user_id':文章表的外鍵(用戶ID) 'id':國家表(當(dāng)前模型)本地鍵(ID) 'id':用戶表本地鍵(ID)
個(gè)人理解:'A'與'B'有關(guān)聯(lián)、'A'與'C'有關(guān)聯(lián),'B'與'C'沒關(guān)聯(lián),遠(yuǎn)程一對(duì)多其實(shí)就是通過'A'來實(shí)現(xiàn)'B'和'C'的查詢,
6、 官方文檔
https://laravel-china.org/docs/laravel/5.5/eloquent-relationships/1333
7、 whereHas使用
/**
* 關(guān)聯(lián)上級(jí)
*/
!empty($data['parent_account']) && $model = $model->whereHas('parentUsers',function ($query) use ($data){
//上級(jí)姓名篩選
$query->select()->where('account','like','%'.$data['parent_account'].'%');
});
ps:主要用于在使用模型關(guān)聯(lián)時(shí),關(guān)聯(lián)表的字段作為條件去篩選