Laravel Eloquent如何获取无任何有效订阅的学生数据
解决方案
原查询的问题在于:whereHas('getSubscription', ...) 会筛选出存在至少一条过期订阅的学生,但这类学生可能同时拥有有效订阅,不符合「无任何有效订阅」的需求。
正确的思路是:排除掉所有存在有效订阅的学生,剩下的就是「没有订阅」或「所有订阅都已过期」的目标学生。
方法一:使用 Eloquent 关联的 whereDoesntHave
这是最简洁的写法,利用 Eloquent 关联的否定查询:
$current_date = now(); // 替换为你的当前日期变量 $expired_student = Student::where('status', 1) ->whereDoesntHave('getSubscription', function ($query) use ($current_date) { // 排除存在有效订阅(过期时间 >= 当前日期)的学生 $query->where('expired_at', '>=', $current_date); }) ->count();
方法二:使用原生 whereNotExists
如果数据量较大,原生查询的性能更优:
use Illuminate\Support\Facades\DB; $current_date = now(); $expired_student = Student::where('status', 1) ->whereNotExists(function ($query) use ($current_date) { $query->select(DB::raw(1)) ->from('subscriptions') // 替换为你的订阅表实际表名 ->whereColumn('subscriptions.student_id', 'students.id') // 关联字段,根据实际表结构调整 ->where('expired_at', '>=', $current_date); }) ->count();
两种方法都能准确筛选出:没有任何订阅记录,或所有订阅均已过期的学生。
内容的提问来源于stack exchange,提问作者Akshay
相关产品推荐
相关产品推荐

