Laravel Eloquent/DB::raw统计普查关联企业数报错排查
解决Laravel查询统计普查企业数量的错误及正确写法
错误原因分析
你遇到的count(): Argument #1 ($value) must be of type Countable|array, string given错误,通常是因为直接对非可数类型(比如DB::raw返回的表达式对象、未执行的查询构建器实例)调用了count()方法,而非对查询返回的集合/数组操作。
正确查询写法
1. DB查询构造器实现
直接按你的原始MySQL逻辑转换,返回每个普查对应的企业数量:
$empresaCounts = DB::table('censosEmpresas') ->select( 'codigoCenso', DB::raw('count(empresa_cif) as total_empresas') // 若要包含null值,改用count(*) ) ->groupBy('codigoCenso') ->get();
get()会返回Eloquent集合,每个元素包含codigoCenso(普查编码)和total_empresas(对应企业数量)字段。- 如果需要关联Censos表确保统计的是有效普查,可加入关联:
$empresaCounts = DB::table('censosEmpresas') ->join('Censos', 'censosEmpresas.codigoCenso', '=', 'Censos.codigoCenso') ->select( 'Censos.codigoCenso', 'Censos.nombre', // 可选,返回普查名称 DB::raw('count(censosEmpresas.empresa_cif) as total_empresas') ) ->groupBy('Censos.codigoCenso', 'Censos.nombre') // 需包含select中所有非聚合字段 ->get();
2. Eloquent模型实现
假设已有CensosEmpresas和Censos模型:
基础统计写法
use App\Models\CensosEmpresas; $empresaCounts = CensosEmpresas::select( 'codigoCenso', DB::raw('count(empresa_cif) as total_empresas') ) ->groupBy('codigoCenso') ->get();
关联模型统计(推荐)
先在Censos模型中定义与CensosEmpresas的一对多关联:
// App\Models\Censos.php public function empresas() { return $this->hasMany(CensosEmpresas::class, 'codigoCenso', 'codigoCenso'); }
然后用withCount直接获取每个普查的企业数量:
use App\Models\Censos; $censosWithCount = Censos::withCount('empresas')->get(); // 每个Censos实例会自动带上empresas_count字段,即对应普查的企业数量
GraphQL resolve方法中使用
如果需要返回键值对格式(普查编码为键,数量为值),可以转换为数组:
return $empresaCounts->pluck('total_empresas', 'codigoCenso')->toArray(); // 或关联模型版: return $censosWithCount->pluck('empresas_count', 'codigoCenso')->toArray();
内容的提问来源于stack exchange,提问作者scorpions78
相关产品推荐
相关产品推荐

