Laravel Eloquent:无初始条件结果时查询次选条件的实现
解决方案
你的原查询用了orWhere,这会直接返回所有status为done或sent的文档,完全不符合「优先查done,无结果再查sent」的逻辑。正确的处理方式是分两步判断:
- 先查询所有
status='done'的文档 - 如果第一步没有找到任何结果,再查询
status='sent'的文档
基础实现代码
// 先获取done状态的文档 $documents = $result->documents()->where('status', 'done')->get(); // 若结果为空,再获取sent状态的文档 if ($documents->isEmpty()) { $documents = $result->documents()->where('status', 'sent')->get(); }
更高效的写法(减少数据查询开销)
如果只需要判断是否存在done状态的文档,用exists()会比get()更高效——它只返回布尔值,不会加载全量数据:
// 判断是否存在done状态的文档 $hasDoneDocuments = $result->documents()->where('status', 'done')->exists(); // 根据判断结果获取对应状态的文档 $documents = $result->documents()->where('status', $hasDoneDocuments ? 'done' : 'sent')->get();
内容的提问来源于stack exchange,提问作者Florin Cioroianu
相关产品推荐
相关产品推荐

