如何使用 Laravel 优雅的取出三级分销数据
如何使用 Laravel 优雅的取出三级分销数据
有这么一张表
id:用户 id | pid:上级用户 id | name:用户姓名 |
---|---|---|
1 | 0 | 张三 |
2 | 1 | 张三邀请的李四 |
3 | 1 | 张三邀请的王五 |
4 | 2 | 李四邀请的赵六 |
如果 pid 是 0,表示【这条记录的用户】是第一级用户,相当于创始人,只会去邀请别人。
需求:取出一个用户的上级和上上级
分析:用户和上级是一对一的关系,Laravel 提供了 hasOne 模型关系。
用户模型是 User,关联的模型也是 User。关联的字段就是 id 和 pid。我们可以无脑的在模型关系中设置两个字段的位置,不对的话交换位置就行了。模型关系如下:
// App\User
public function parent()
{
return $this->hasOne('App\User', 'id', 'pid');
}
这样我们就能使用 with 很方便地找到一个用户的上级:
$userAndParent = App\User::with('parent')->find(4);
/**
{
"id": 4,
"pid": 2,
"name": "李四邀请的赵六",
"parent": {
"id": 2,
"pid": 1,
"name": "张三邀请的李四"
}
}
*/
再取出上上级:
$userAndGrandParent = $userAndParent->parent->load('parent');
/**
{
"id": 2,
"pid": 1,
"name": "张三邀请的李四",
"parent": {
"id": 1,
"pid": 0,
"name": "张三"
}
}
*/
Laravel 提供了更简洁的方式来嵌套调用模型关系
只需要在 with 方法中使用 . 就能将两个模型关系嵌套调用:
$userAndParentAndGrandparent = App\User::with('parent.parent')->find(4);
/**
{
"id": 4,
"pid": 2,
"name": "李四邀请的赵六",
"parent": {
"id": 2,
"pid": 1,
"name": "张三邀请的李四",
"parent": {
"id": 1,
"pid": 0,
"name": "张三"
}
}
}
*/
需求:取出一个用户的下级和下下级
原理同上。
// 模型关系
public function sons()
{
return $this->hasMany('App\User', 'pid', 'id');
}
$userAndSonsAndGrandSons = App\User::with('sons.sons')->find(1);
/**
{
"id": 1,
"pid": 0,
"name": "张三",
"sons": [
{
"id": 2,
"pid": 1,
"name": "张三邀请的李四",
"sons": [
{
"id": 4,
"pid": 2,
"name": "李四邀请的赵六"
}
]
},
{
"id": 3,
"pid": 1,
"name": "张三邀请的王五",
"sons": []
}
]
}
*/