在 has_many 上具有条件的 CakePHP 分页
Posted
技术标签:
【中文标题】在 has_many 上具有条件的 CakePHP 分页【英文标题】:CakePHP Pagination with conditions on has_many 【发布时间】:2009-11-07 18:58:14 【问题描述】:所以我有一个 User 表和一个带有 User hasMany Histories 的 History 表,我正在尝试在 user 表上实现分页。
我的问题是我有搜索,一些可以搜索的东西是历史表中的东西。有没有办法根据 hasMany 关联的表中的数据过滤分页结果? Containable 最初似乎是一种解决方案,它允许这样的过滤,但仅限于检索相关数据,而不是记录本身(除非我遗漏了什么?)
以前有人解决过这个问题吗?
【问题讨论】:
【参考方案1】:由于它是一个 hasMany 关系,这意味着 Cake 需要进行 2 个单独的查询:1 个在 users 表上,一个在 histories 表上以检索所有关联。由于在第二个查询之前不会检索历史数据,因此您的第一个查询无法通过 WHERE 条件过滤历史模型中的字段。
要解决此问题,您可以执行以下两项操作之一:
使用 Containable 对 History 执行分页(因为 History belongsTo User,意味着只会执行 1 个查询)。
按照您已经在执行的方式对用户执行分页,除了执行对历史记录的临时联接,使其不再是 hasMany 关系。
例如:
$this->User->bindModel(array('hasOne' => array('History')));
$this->paginate['User']['contain'][] = 'History';
$this->paginate('User', array('History.some_field' => 'some_value'));
【讨论】:
非常感谢!在花了几个小时之后,我不敢相信答案如此简单。 我可能误读了,但看起来您只在答案中显示了选项 2 的代码。你能显示选项1的代码吗?此外,这段代码 sn-p 似乎根本不适合我。以上是关于在 has_many 上具有条件的 CakePHP 分页的主要内容,如果未能解决你的问题,请参考以下文章