Laravel ORM 中,根据关联查询的字段值,对主查询排名

这里有一个场景,查询一段时间内,用户消费记录的排名情况

我们假设有一个 users 表和一个 orders 表

// Order.php
class Order extends Model
{

}

// User.php
class User extends Model
{
    public function orders()
    {
        $this->hasMany(Order::class)
    }
}

根据 laravel 文档说明,我们可以使用 whereHas 很方便的统计订单数大于 5 的用户

  $users = User::has('orders', '>', 5);
  // 或者统计已支付的订单数
  $users = User::whereHas('orders', function($query){
          $query->where('pay_status', 1);
  }, '>', 5);

要实现我们开头说的排名功能,我们需要分两步

use Illuminate\Support\Facades\DB;

// 首先我们计算该用户的总消费金额
$user_total_money = Order::where('user_id', 123)->sum('paied_money');

// 然后计算高于该用户消费金额的用户
$users_exceed_count = User::whereHas('orders', function($query){
    $query->select(DB::raw('sum(paied_money)'));
    $query->where('pay_status', 1);
}, '>', $user_total_money)
    ->count();

$users_exceed_count 加 1 就是该用户的消费金额的排名了

本作品采用《CC 协议》,转载必须注明作者和本文链接
大多数知识,不需要我们记住,只需要认知即可
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 1

消费排名使用redis来不是更好

4年前 评论
tu6ge-php (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!