2014-11-06 181 views
0

我在问自己一些事情......这里是问题:具有多个状态的Cakephp模型

我有一个模型请求。此模型具有状态。 (假设它是一个整数)

由于状态将通过时间改变,因为我想保持的每个变化,这是在我心中非常清楚的记录,状态不会的场请求表/模型。

我想我会添加一个表/模型RequestStatus说把CakePHP

Request的hasMany RequestStatus

后来我想,这将是简单的检索所有的只有一个有效状态的请求。

但我错了。

使用容器并不好,因为它检索请求,即使它们有错误的状态(或者即使它们没有状态)。

所以,我测试了2个解决方案:

  • 绑定的飞RequestStatus模型作为hasOne关系,但 它不是做时按预期工作

  • 使用加入键/阵列我找到电话。

显然有一些我错过了,因为这不起作用。

我错过了什么吗?或者最好的方法是在Request表中添加一个状态字段?

编辑:什么我忘了提的是,我需要使用此查询使用CakePHP

回答

0

的分页我将承担一些事情你没有提到。首先,我想你也创建了一个RequestStatus belongsTo Request的关系。我想象你的RequestStatus表有四列:idstatus,request_idcreatedrequest_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) 
    )); 
} 
+0

你是绝对正确的,你假设。 – azerto00 2014-11-06 22:30:32

+0

@ azerto00重新阅读我的答案后,我发现方法#1不会返回你所需要的。也许最好使用'having'而不是'conditions',因为过滤器是在订单和组制成之后进行的。我会编辑它。 – Deimoks 2014-11-06 22:42:10

+0

明天我会试试,明天答案。谢谢 ! – azerto00 2014-11-06 22:43:35