用户分表后怎么通过uid获取用户信息的方法
在前段时间湖南红网有一个需求,大概就是调用用户被置顶的帖子数排名的top10,测试的基本效果就是首先查询到top10的uid集合(由于功能模块原来的的数据结构中仅在置顶表中查询得到uid的信息),最终效果如下(由于测试网站只有少部分数据,因此下面只显示5个):
得到uid之后还需要得到用户相关的几个数据,包括头像、个人主页的url以及用户名;头像在discuz中可以使用avatar方法获取,个人主页的url通过uid直接拼装即可。而用户名则需要另外获取,可能有人会说直接使用DB类的fetch_first方法查询common_member表即可查到用户对应的用户名。
但一开始就有个前提,那就是网站的用户分表了,比如一般分表后会产生两个用户表,分别是common_member和common_member_archive,所以光查询前者肯定是不行的。其实阅读discuz的本身的源代码就可以发现,在很多地方他的做法都是通过判断用户是否在common_member中,如果存在则直接调用该值,否则需查询common_member_archive。如下是discuz本身的某个模块的源代码:
这样显然是可行的,但是通过C类发现并没有通过uid来查username的,只有通过username来查uid的,以上就是这样的。如果要用这种思路则需要这么来写:
然而,实际上有更加简便的方式的
那就是通过uc来做处理,因为要的是用户名等uc中也保存了的信息,而且对于普通网站用户而言uc中保存的用户信息和dz中保存的用户信息是一致的。比如在discuz源代码中可以看到如下这样的方法:
只要熟悉discuz开发的朋友都知道,看命名就可以顾名思义的,该方法是用于调取uc中的用户信息的。我们可以在uc_client/client.php找到该方法:
然后可以在uc_client/control/user.php中找到该方法所调用的方法:
也就是我们只需要在一开始的时候第二个参数传入1即可,也就是在该方法中会调用get_user_by_uid(),其中的参数其实是uid。然后我们可以在uc_client/model/user.php找到该方法:
这样就已经调取uc中的用户信息,需要注意的是,在上一步的onget_user方法中返回的时候并没有返回用户的所有信息,也不是返回带有uid、username、email等这些键值的数组。所以如果返回的是$user,如果需要取username的值,不能够写成$user['username']的。
至此,采用调用uc用户的方式通过discuz的用户uid获取的了用户的用户名。