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
拉回,在这些用户下,将有 SystemSessions
,location_id
为 34,但是,Users
没有该位置的 SystemSessions
也出现在结果中(只有空 SystemSessions
数组)。
我想要的是只从那个位置拉回 Users
有 SystemSessions
的人,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
!
另见
我正在处理遗留的 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
拉回,在这些用户下,将有 SystemSessions
,location_id
为 34,但是,Users
没有该位置的 SystemSessions
也出现在结果中(只有空 SystemSessions
数组)。
我想要的是只从那个位置拉回 Users
有 SystemSessions
的人,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
!
另见