这样行不:
代理表 (ID,父ID,代理名称)和订单表 (ID,代理ID,……)
查订单时,先从代理表中,查出当前和所有下属代理,然后再到订单表中查找?
前者可通过 CTE
实现,或者手动查出后,WHERE 代理ID IN (a, b, c, d, ……)
?
订单量不大的话表结构
order_id | level |
---|---|
100 | 10000-10051 |
101 | 10000 |
102 | 4399 |
103 | 10000-10051 |
一级代理 | SQL片段 |
---|---|
查询自己 | level = “10000” |
查询下级 | level like “10000-%” |
查询自己和下级 | level like “10000%” |
二级代理 | SQL片段 |
---|---|
查询自己 | level = “10000-10051” |
平台 | SQL片段 |
---|---|
查询平台单 | level is null |
查询所有 | … |
你已经知道两种做法了。就是冗余一种,不冗余一种。
我推荐第3种,建一个order_append 表,id,order_id, order_key, order_value 这几个字段。
然后,order_key 分别等于
agent0_id、agent1_id、agent2_id,甚至再多几层都没关系。
这样的话,order表会比较干净,查询也方便,兼顾到方方面面。
特别的,order表经常有不同类型的 订单,于是字段也会有差异,这种表就够灵活。
还有,我尽量不用like的。
这个就是父子订单的查询吧。其实还有一只设计方式就是 在订单编号或者id上处理:父亲是 001(三位),儿子(001),孙子(001),后边的n位是就自己定义了。这样 父亲1的都是 001开头的,儿子1的肯定都是 001001开头的,孙子1的类似,这样你想查询出某个代理的下级下下级,就直接 like就行了 ,比如 like '001001%' 就肯定是 父亲1的儿子1的下级了
只要做过商城系统就知道,无限层级也是单独一个字段ID就能搞定的事,每个会员里多一个parent_id 的字段,parent_id = 上级ID,之后通过循环以此为太阳线抓取全部ID出来就是了,根本不用搞得那么复杂
// User用户模型
// 儿子
public function sons()
{
return $this->hasMany(User::class, 'parent_id');
}
// 孙子
public function getGrandsonsAttribute()
{
$sons = $this->sons()->pluck('id')->toArray();
return $this->query()->whereIn('parent_id', $sons)->pluck('id')->toArray();
}
......
// 业务Controller
$user = User::query()->first();
// 一级代理的,查看自己以及下级
$orders = Order::query()->whereIn('user_id', array_merge($user->sons, [$user->id]));
// 平台的,查看自己以及下两级
$orders = Order::query()->whereIn('user_id', array_merge($user->sons, $user->grandsons, [$user->id]));
推荐文章: