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": []
        }
    ]
}
*/

发表评论