Laravel关联计数报错Call to a member function addEagerConstraints() on int及withCount返回空数组问题求助
解决Laravel关联计数的两个问题
先帮你拆解一下遇到的两个问题,以及对应的解决方案:
1. 为什么with('getCourseCount')会报错?
with()方法是用来预加载模型关联关系的,它接受的参数是你在模型中定义的关联方法名称(比如你的courses()),而不是自定义的普通方法。
你的getCourseCount()是模型上的一个返回整数的普通方法,Laravel尝试把它当成关联关系去处理时,自然会报错——因为它返回的是int,而不是关联查询构造器,所以才会出现Call to a member function addEagerConstraints() on int。
2. 为什么withCount('courses')返回空数组?
withCount本身的用法是正确的,返回空数组大概率是以下原因之一:
$cart_items中的ID在packages表中不存在:先单独执行基础查询Package::whereIn('id', $cart_items)->select('id', 'name')->get(),看看是否能拿到数据。如果这个查询本身返回空,那withCount自然也会返回空。- 关联关系的外键配置错误:检查
courses表中的package_id字段是否真的关联到packages表的id字段,且有实际数据对应。你的courses()关联方法看起来是对的,但要确保数据库中确实有course记录的package_id指向存在的packageID。 - 另外注意:
select('id', 'name')不会影响withCount的结果,Laravel会自动把计数字段(默认是courses_count)追加到查询结果中,所以即使你只选了id和name,模型对象里依然会有courses_count属性。
正确的解决方案
推荐使用Laravel官方的withCount方法,这是处理关联计数最高效的方式,同时排查数据和关联的问题:
// 第一步:先确认基础查询是否有数据 $basePackages = Package::whereIn('id', $cart_items)->select('id', 'name')->get(); if ($basePackages->isEmpty()) { // 说明$cart_items里的ID没有对应的Package,先检查这个数组的数据 dd('没有找到对应ID的套餐数据,请检查$cart_items'); } // 第二步:使用withCount获取关联计数 $packagesWithCourseCount = Package::whereIn('id', $cart_items) ->withCount('courses') ->select('id', 'name') ->get(); // 访问计数结果 foreach ($packagesWithCourseCount as $package) { echo "套餐{$package->name}包含{$package->courses_count}门课程"; }
如果一定要用自定义的getCourseCount方法(不推荐,会有N+1查询问题),不要用with(),而是在获取模型后直接调用:
$packages = Package::whereIn('id', $cart_items)->select('id', 'name')->get(); foreach ($packages as $package) { $courseCount = $package->getCourseCount(); // 处理计数逻辑 }
内容的提问来源于stack exchange,提问作者Jack The Baker
相关产品推荐
相关产品推荐

