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
相关产品推荐
相关产品推荐

