在 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 分页的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 3 - 查找多个条件

Cakephp 2.x 在同一字段上查找同时具有 DISTINCT 和 COUNT 的查询

预加载 has_many 与动态条件的关联

包括与条件的左连接 has_many 关联

具有两个模型会话的 Cakephp 身份验证组件

Rails has_many 关联计数子行