You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 23:48:22