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 协议》,转载必须注明作者和本文链接
推荐文章: