CakePHP查询有结果但Service实体的related_services数组为空
问题解决步骤
1. 修正关联的BindingKey定义
当前关联的bindingKey指定了三个字段,但实际只需要通过servicenumber匹配关联数据。多出来的id和service_group_id会导致关联匹配失败(条件里明确要求service_group_id不等),所以仅保留servicenumber即可:
$this->hasMany('RelatedServices', [ 'foreignKey' => 'servicenumber', 'bindingKey' => 'servicenumber', // 仅保留用于匹配的字段 'className' => 'Services', 'strategy' => 'subquery', 'finder' => 'related', 'conditions' => [ 'RelatedServices.service_group_id != ' . $this->aliasField('service_group_id') ] ]);
2. 修正自定义Finder的字段选择
你的Finder中手动指定了select字段,会干扰CakePHP的实体自动映射(hydration)。去掉不必要的自定义select,让框架自动处理字段:
public function findRelated(Query $query, array $options = []): Query { return $query->enableAutoFields(true); }
如果确实需要自定义字段选择,确保只选择RelatedServices的字段,避免混淆主表和关联表的字段:
public function findRelated(Query $query, array $options = []): Query { return $query->select($this->getSchema()->columns())->enableAutoFields(true); }
3. 检查实体的可填充属性
确保Service实体类中配置了related_services的可填充权限,否则框架不会将关联数据写入实体:
// src/Model/Entity/Service.php class Service extends Entity { protected $_accessible = [ // 其他实体字段... 'related_services' => true, ]; }
完成以上修正后,重新执行查询,related_services数组应该会正确填充匹配的关联数据。
内容的提问来源于stack exchange,提问作者Steve Kirsch
相关产品推荐
相关产品推荐

