You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:23:19