CakePHP hasMany关联查询如何同时限定主表和关联表的查询字段
问题根因
你第一次查询关联为空,是因为CakePHP的ORM在处理hasMany关联时,必须拿到主表的主键字段才能匹配关联表的外键(也就是documento_processo_administrativo表的processo_administrativo_id)。你首次查询主表只选了codigo_pa,没有查询主键id,ORM无法完成关联匹配,所以关联结果是空数组。
你第二次加了enableAutoFields(true),这个配置会强制主表查询所有字段,所以关联能正常匹配,但也带来了大量不需要的主表字段。
解决方法
不需要开启enableAutoFields,只需要在主表的select配置中,同时加上你需要的业务字段和主表主键即可:
<?php $tablePA = TableRegistry::get('ProcessoAdministrativo'); debug($tablePA->find() // 主表同时选择主键(用于关联匹配)+ 所需业务字段 ->select(['id', 'codigo_pa']) ->contain(['DocumentoProcessoAdministrativo' => fn($q) => $q->select(['id','descricao','ordem','processo_administrativo_id']) ])->toArray());
执行后返回的结果里,主表只会有id和codigo_pa两个字段,关联表也只会返回你指定的4个字段,完全符合性能优化的需求。
补充说明
如果你不想把主表的id暴露在最终返回结果中,可以在查询得到结果集后,遍历实体手动unset掉id属性,或者在ProcessoAdministrativo实体类的$_hidden属性中配置隐藏id字段即可。
内容的提问来源于stack exchange,提问作者celsowm
相关产品推荐
相关产品推荐

