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

Laravel Eloquent动态外键设置及withCount报错修复

报错原因

报错核心是Eloquent关联加载机制不支持给关联方法传参:调用with/withCount时Eloquent会自动实例化关联方法,不会给你定义的$id形参传值,带自定义参数的关联方法本身不符合Eloquent的关联定义规范。
另外你原有代码还有几个语法/逻辑问题:

  • 关联定义里'code缺少闭合单引号
  • 闭包参数里'unit缺少闭合单引号
  • 查询字段写的decs和实际表字段Desc不符
  • 固定传单个$column的逻辑不符合需求:Code2每条记录的cid可能不同,需要逐行匹配对应列,不能全局用同一个统计列。
实现方案

不需要给关联方法传参,先修正模型关联定义,给一个默认外键占位即可,后续查询时动态覆盖关联条件。因为你只有查询权限、无法修改表结构,直接把已知的动态列匹配条件写入统计逻辑即可,兼容性最高。

第一步:修正模型关联

去掉关联方法的自定义参数,给一个默认外键做占位:

class Code2 extends Model
{
    // 不要给关联方法加自定义参数,默认外键选一个已有字段占位即可
    public function unit()
    {
        return $this->hasMany(Code1::class, '34222X234X4422', 'Code');
    }
}

第二步:编写withCount查询

在闭包里移除默认的关联匹配条件,新增按cid动态匹配对应列的统计规则:

$detail1 = Code2::withCount([
    'unit' => function ($query) {
        $code1Table = (new Code1())->getTable();
        $code2Table = $query->getModel()->getTable();
        
        // 清除关联默认的固定外键匹配条件
        $query->getQuery()->wheres = array_filter(
            $query->getQuery()->wheres,
            fn($where) => !str_contains($where['column'] ?? '', '34222X234X4422')
        );

        // 按cid动态匹配Code1对应列,新增匹配条件
        // 如果后续Code1新增其他cid对应的列,在下方新增OR分支即可
        $query->whereRaw("
            (
                `{$code2Table}`.`cid` = 4422 AND `{$code1Table}`.`34222X234X4422` = `{$code2Table}`.`Code`
                OR `{$code2Table}`.`cid` = 4423 AND `{$code1Table}`.`34222X234X4423` = `{$code2Table}`.`Code`
                OR `{$code2Table}`.`cid` = 4424 AND `{$code1Table}`.`34222X234X4424` = `{$code2Table}`.`Code`
            )
        ");
    }
])->get(['id', 'cid', 'Code', 'Desc']);

逻辑验证

对照你给出的示例数据,返回结果的统计值符合预期:

  • ID=1(cid=4422,Code=A1):Code1对应列中A1出现2次,unit_count值为2
  • ID=2(cid=4423,Code=A2):Code1对应列中无A2,unit_count值为0
  • ID=3(cid=4422,Code=A3):Code1对应列中A3出现2次,unit_count值为2
  • ID=4(cid=4424,Code=A4):Code1对应列中无A4,unit_count值为0

如果你的账号有查询information_schema的权限,也可以先查询Code1表所有符合34222X234X*命名规则的列,动态拼接上述whereRaw的条件,不需要手动维护列分支,适合列经常变动的场景。

内容的提问来源于stack exchange,提问作者plangjim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:42:17