Cakephp 2 如何对模型进行分页但将结果限制为仅具有条件关联模型的结果

Cakephp 2 how to paginate a model but restrict the results to only those with a conditional associated model

我正在处理遗留的 Cakephp 2 系统,在弄清楚分页应该如何工作时遇到了一些问题。

我有一个 Users 模型,一个 SystemSessions 模型和一个 Locations 模型。 Users hasmany SystemSessions 并且每个 SystemSession 都有一个 location_id。我正在尝试找出如何对 Users 进行分页以仅显示 Users 具有特定 location_id.

SystemSessions

如果我尝试:

$conditions['conditions']['User.role'] = 'User';
$conditions['contain'] = array(
    'SystemSession' => array(
        'conditions' => array(
            'SystemSession.location_id' => '34'
        )
    )
);

这将每 User 拉回,在这些用户下,将有 SystemSessionslocation_id 为 34,但是,Users 没有该位置的 SystemSessions 也出现在结果中(只有空 SystemSessions 数组)。

我想要的是只从那个位置拉回 UsersSystemSessions 的人,Users 从那个特定位置没有 SystemSessions 的人,不应出现在结果中。

通常我可以循环并删除我不想要的那些,但是因为我试图对结果进行分页,所以这会中断所有分页等等。

谁能给我指点一下?

您必须复制您在 SQL 级别上所做的事情来解决这个问题,例如使用连接来提取关联数据并进行过滤。您无法单独使用 contain 解决此问题,因为 hasMany 关联是在单独的查询中检索的,因此您的条件仅影响关联数据的原因。

假设 $conditions 是您的取景器选项:

// ...
$conditions['joins'] = array(
    array(
        'table' => 'system_sessions',
        'alias' => 'SystemSession',
        'type' => 'INNER',
        'conditions' => array(
            'SystemSession.user_id = User.id',
            'SystemSession.location_id' => 34,
        )
    )
);
$conditions['group'] = 'User.id';

这将根据您想要的条件在 system_sessions table 上应用 INNER 连接,例如:

// ...
INNER JOIN
    system_sessions SystemSession ON 
        SystemSession.user_id = User.id AND
        SystemSession.location_id = 34
GROUP BY
    User.id

从而过滤掉所有不存在匹配项的用户。要检索关联数据,您仍然需要使用 contain!

另见