的分页我将承担一些事情你没有提到。首先,我想你也创建了一个RequestStatus belongsTo Request
的关系。我想象你的RequestStatus表有四列:id
,status
,request_id
和created
。 request_id
列是外键,created
是CakePHP在创建新行时填充的魔术字段。我也假设你正在使用Containable行为。
有了这一点,你可以去三个不同的方式:
1)你可以与他们的请求一起取得最后的有效状态。
在你RequestModel:
public function getValidRequests() {
$db = $this->RequestStatus->getDataSource();
$subquery = $db->buildStatement(array(
'fields' => array('request_id', 'max(created) as lastcreated'),
'table' => $db->fullTableName($this->RequestStatus),
'alias' => 'temp',
'group' => array('request_id')
), $this->RequestStatus);
return $this->RequestStatus->find('all', array(
'contain' => array('Request'),
'joins' => array(
array(
'table' => '(' . $subquery . ')',
'alias' => 'rs2',
'type' => 'right',
'conditions' => array(
'RequestStatus.request_id = rs2.request_id',
'RequestStatus.created = rs2.lastcreated'
)
)
),
'conditions' => array('RequestStatus.status' => 1),
'order' => array('RequestStatus.request_id' => 'desc')
));
}
2)你可以检索其状态的所有请求,那么只有那些返回与去年有效状态。
在你RequestModel:
public function getValidRequests() {
$requests = $this->find('all', array(
'contain' => array(
'RequestStatus' => array(
'order' => array('RequestStatus.created' => 'desc')
)
)
));
$result = array();
foreach ($requests as $request) {
if ($request['RequestStatus'][0]['status'] == 1)
$result[] = $request;
}
return $result;
}
3)非规范化。
在您的Request
表中添加一个last_status
列。因此,每次更新请求状态时,请将该新状态插入RequestStatus
表中,并将该新状态保存为Request.last_status
。现在你可以简单地做:
public function getValidRequests() {
return $this->find('all', array(
'conditions' => array('Request.last_status' => 1)
));
}
你是绝对正确的,你假设。 – azerto00 2014-11-06 22:30:32
@ azerto00重新阅读我的答案后,我发现方法#1不会返回你所需要的。也许最好使用'having'而不是'conditions',因为过滤器是在订单和组制成之后进行的。我会编辑它。 – Deimoks 2014-11-06 22:42:10
明天我会试试,明天答案。谢谢 ! – azerto00 2014-11-06 22:43:35