Laravel 11中如何判断指定ID是否存在于关联模型结果集?
解决方案
首先明确问题根源:你调用get()后得到的是Collection集合实例,而findOrFail是Laravel QueryBuilder(查询构造器)的方法,Collection并没有这个方法,这就是报错的原因。以下是几种不用遍历的最优解决方案:
方案一:直接在查询构造器上调用findOrFail(推荐)
如果需要获取该任务模型实例,同时希望在不存在时抛出异常,直接去掉get(),在关联查询链上调用findOrFail即可:
$task = LoggedUserFacade::getLoggedUser()->uncompletedTasks()->findOrFail($taskId);
这个方式直接操作数据库查询,只会返回目标任务(如果存在),不存在则抛出ModelNotFoundException,性能和代码简洁度都最优。
方案二:仅判断任务是否存在(性能最优)
如果只需要确认任务是否在用户未完成任务中,不需要获取模型实例,用exists()更高效:
$isExists = LoggedUserFacade::getLoggedUser() ->uncompletedTasks() ->where('tasks.id', $taskId) ->exists();
生成的SQL会直接判断存在性,返回布尔值,数据库层面的查询开销最小。
方案三:利用Collection的contains方法(适合已加载关联的场景)
如果你已经提前加载了用户的未完成任务集合(比如用了with('uncompletedTasks')),可以直接用Collection的contains方法判断:
$isExists = LoggedUserFacade::getLoggedUser()->uncompletedTasks->contains($taskId);
注意这里是uncompletedTasks(不带括号),会直接获取已加载的集合,避免重复查询数据库,但如果没提前加载,会触发懒加载,此时性能不如方案二。
内容的提问来源于stack exchange,提问作者Petro Gromovo
相关产品推荐
相关产品推荐

