小可ThinkPHP学堂

?找回密码
?立即注册
搜索
热搜: 活动 交友 discuz
查看: 287|回复: 0
打印 上一主题 下一主题

[ThinkPHP] ThinkPHP6对关联统计的改进

[复制链接]

41

主题

41

帖子

192

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
192
跳转到指定楼层
楼主
发表于 2019-9-17 21:16:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

在ThinkPHP5中,我们可以利用关联模型进行关联统计,例如统计id为1、2、3的用户拥有的cards数:

  1. $list = User::withCount('cards')->select([1,2,3]);
  2. foreach($list as $user){
  3. ? ? // 获取用户关联的card关联统计
  4. ? ? echo $user->cards_count;
  5. }
复制代码

关联统计功能会在模型的对象属性中自动添加一个以“关联方法名+_count”(支持自定义)为名称的动态属性来保存相关的关联统计数据。

可以使用闭包的形式对条件进行过滤:

  1. $list = User::withCount(['cards'=>function($query){
  2. ? ? $query->where('status',1);
  3. }])->select([1,2,3]);

  4. foreach($list as $user){
  5. ? ? // 获取用户关联的card关联统计
  6. ? ? echo $user->cards_count;
  7. }
复制代码

还可以指定统计属性的名称(也就是别名,下面例子是card_count,注意区别):

  1. $list = User::withCount(['cards'=>'card_count'])->select([1,2,3]);
  2. foreach($list as $user){
  3. ? ? // 获取用户关联的card关联统计
  4. ? ? echo $user->card_count;
  5. }
复制代码

但是如果我们既想设置别名,又想筛选条件时,TP5是没有提供这个功能的,(例如我们要分别统计status为1的cards数和status为0的cards数,那么这两个需要使用筛选条件,并且筛选出的结果名称不能相同)。

还好ThinkPHP6提供了别名的功能(不知道TP5以后会不会增加这个功能):

  1. $list = User::withCount(['cards' => function($query, &$alias) {
  2. ? ? $query->where('status',1);
  3. ? ? $alias = 'card_count';
  4. }])->select([1,2,3]);

  5. foreach($list as $user){
  6. ? ? // 获取用户关联的card关联统计
  7. ? ? echo $user->card_count;
  8. }
复制代码

Laravel5.5以后的版本也具备这个功能:

  1. $posts = Post::withCount([
  2. ? ? 'comments',
  3. ? ? 'comments as pending_comments_count' => function ($query) {
  4. ? ?? ???$query->where('approved', false);
  5. ? ? }
  6. ])->get();

  7. echo $posts[0]->comments_count;

  8. echo $posts[0]->pending_comments_count;
复制代码

By小可老师

2019年9月17日

转载请标明出处

可以加QQ群415216728进行交流。

公众号搜小可ThinkPHP学堂




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表