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

Laravel Eloquent如何查询无关联options匹配记录的题目数据

Laravel 关联查询「主表存在、关联表无匹配记录」实现方案

直接使用Laravel Eloquent内置的关系查询方法即可实现需求,不需要手写复杂的联表SQL:


1. 查询无任何对应选项记录的题目

使用doesntHave方法,判断指定关联关系完全不存在匹配记录即可,代码如下:

// 注意:模型名建议遵循PSR规范首字母大写,即Question、Option
$questionsNoOptions = Question::doesntHave('options')->get();

对应你提供的测试数据,该查询会返回id为2、题目名为2+2 = ?的记录,符合预期。


2. 查询无对应正确选项的题目

如果需要给关联匹配加筛选条件,使用带闭包条件的whereDoesntHave方法,在闭包内指定正确选项的判断规则即可,代码如下:

$questionsNoCorrectOption = Question::whereDoesntHave('options', function ($query) {
    // 筛选关联表中is_correct=1的记录不存在的主表数据
    $query->where('is_correct', 1);
})->get();

对应你提供的测试数据,该查询会返回两条记录:

  • id=1的1+1 ?:虽然有2条选项记录,但所有选项is_correct都为0,无正确选项
  • id=2的2+2 = ?:无任何选项记录,自然也不存在正确选项

补充说明

  • 上述两个方法是Laravel 5版本后就内置支持的关联查询方法,底层自动生成LEFT JOIN ... WHERE 关联表主键 IS NULL类型的SQL,执行效率和手写原生SQL一致
  • 如果需要分页展示结果,直接把调用的get()方法替换为paginate(每页条数)即可,例如->paginate(15)
  • 你当前代码里模型类名写为小写question、option不符合Laravel的PSR命名约定,虽然可以运行,但后续维护、使用路由模型绑定等功能时容易出现异常,建议调整为首字母大写的类名。

内容的提问来源于stack exchange,提问作者Ngô Thị Thuỳ Chi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:09:15