Cake PHP 2无法关联hasMany关系的AffiliateId数据问题
核心问题
你的代码存在两个直接导致结果不符合预期的错误:
- 连接类型选错:使用
inner内连接时,数据库只会返回两表同时满足关联条件的记录,所有没有对应AffiliateId的用户会被直接过滤,和你“无关联数据则保留用户、不做关联”的需求完全冲突。 - 返回结果未包含关联表字段:你设置了
recursive => -1关闭了CakePHP的自动关联查询逻辑,同时手动编写join时,CakePHP不会自动将join表的字段加入查询列,就算存在匹配的关联数据,也不会出现在最终返回的结果集中。
修正方法
两种实现方式都可以满足需求:
方案1:调整现有手动join逻辑
无需修改模型定义,仅调整连接类型和查询字段即可:
$users = $this->User->find('all', array( 'joins' => array( array( 'table' => 'affiliate_ids', 'alias' => 'AffiliateId', 'type' => 'left', // 替换为左连接,保留全部User表记录 'conditions' => array( 'User.id = AffiliateId.user_id' ) ) ), // 主动声明查询字段,包含关联表字段 'fields' => array( 'User.*', 'AffiliateId.*' ), 'order' => array( 'User.username' => 'ASC' ), 'recursive' => -1 ));
方案2:使用CakePHP原生关联逻辑(推荐)
先在User模型中定义和AffiliateId的一对多关联:
// 文件路径:app/Model/User.php public $hasMany = array( 'AffiliateId' => array( 'className' => 'AffiliateId', 'foreignKey' => 'user_id' ) );
查询时通过contain指定关联模型即可,CakePHP会自动处理连接、字段匹配和结果格式化,无关联数据的用户对应的AffiliateId字段会返回空数组:
// 开启可包含关联查询的行为,若全局已开启可省略 $this->User->Behaviors->load('Containable'); $users = $this->User->find('all', array( 'contain' => array('AffiliateId'), 'order' => array( 'User.username' => 'ASC' ) ));
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

