Laravel ORM 中,根據關聯查詢的欄位值,對主查詢排名

tu6ge-php發表於2020-10-20

這裡有一個場景,查詢一段時間內,使用者消費記錄的排名情況

我們假設有一個 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 協議》,轉載必須註明作者和本文連結
大多數知識,不需要我們記住,只需要認知即可

相關文章