CakePHP 2.10分页器关联模型异常:仅获取主模型数据求助
问题原因
你用joins完成了表连接,但CakePHP 2.x的分页器默认只会查询主模型(Application)的字段,不会自动包含关联表的字段。再加上你设置了recursive=-1,彻底关闭了ORM的自动关联读取逻辑,所以结果里只有Application的数据,看不到ApplicationPayday的内容。
解决办法
给你两种可行的方案,按需选择:
方案1:手动指定要获取的字段(适合临时场景)
在分页设置里添加fields选项,明确列出需要从Application和ApplicationPayday表中获取的字段,注意用表别名区分:
$this->Paginator->settings = array( 'maxLimit' => 20, 'joins' => array( array( 'table' => 'tlp_application_paydays', 'alias' => 'ApplicationPayday', 'type' => 'inner', 'conditions' => array( 'ApplicationPayday.application_id = Application.id' ) ), ), // 新增fields选项,指定要查询的字段 'fields' => array( 'Application.id', 'Application.name', // 替换成你实际需要的Application字段 'ApplicationPayday.id', 'ApplicationPayday.payday_date', // 替换成你实际需要的ApplicationPayday字段 // 其他需要的字段 ), 'order' => array( 'Application.id' => 'desc' ), 'recursive' => -1 );
这样查询结果里就会包含ApplicationPayday的字段数据了。
方案2:用CakePHP的关联+Containable行为(更符合ORM规范)
既然你说普通模型查询里关联逻辑正常,说明Application模型已经定义了和ApplicationPayday的关联(比如hasMany或hasOne),那可以直接用contain替代手动写joins,同时保持recursive=-1(推荐关闭recursive,用Containable精确控制关联):
第一步:确保Application模型启用Containable行为
在Application.php模型文件里添加:
public $actsAs = array('Containable');
第二步:修改分页设置,用contain替代joins
$this->Paginator->settings = array( 'maxLimit' => 20, // 用contain指定要关联的模型 'contain' => array('ApplicationPayday'), 'order' => array( 'Application.id' => 'desc' ), 'recursive' => -1 );
这样分页查询会自动处理关联,结果里每个Application条目下会有对应的ApplicationPayday子数组,结构更符合CakePHP的ORM返回格式。
如果需要对关联表加条件,可以在contain里进一步设置:
'contain' => array( 'ApplicationPayday' => array( 'conditions' => array('ApplicationPayday.status' => 1), // 示例条件 'fields' => array('id', 'payday_date') // 指定关联表字段 ) )
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

