按计算字段从afterFind回调中对$ results数组进行排序?

时间:2013-05-08 07:21:11

标签: cakephp sorting cakephp-2.0

首先发布的问题,我有一点蛋糕经验,但我远没有精通。在我的Model - Product中,我使用afterFind回调来进行一些计算。 首先,它检查产品的保修是否仍然有效(startDate + warranty_period),然后计算保修期剩余的时间。 为此,我使用:

$future = '+'.$results[$key]['Product']['warranty_period'].'months';    
$startDate = $results[$key]['Product']['created'];
$endDate = date('Y-m-d', strtotime($future, strtotime($startDate)));
$curDate = date('Y-m-d');

if($endDate > $curDate){
$date1 = new DateTime($endDate);
$date2 = new DateTime($curDate);
$interval = $date1 -> diff($date2);

默认情况下,$ interval作为一串数字返回,例如'01119'。 然后我运行以下代码输出它:0年,11个月,19天。

//years     
if($interval->y > 0){
$years = $interval->y.' years, ';
}
//months        
if($interval->m > 0){
$months = $interval->m.' months, ';
}
//days
if($interval->d > 0){
$days = $interval->d.' days';
}
$results[$key]['Product']['warranty_time'] = $years.$months.$days;
}else{
$results[$key]['Product']['warranty_time'] = 'Expired';
}

然后在afterFind返回的$ results数组中传递这些计算的结果。 这是我的实际问题:我如何根据保修期剩余时间对$ results数组进行排序?

我在其他一些领域使用Paginator,使用echo $ this-> Paginator-> sort('name',Name); 这非常适合对记录ASC或DESC进行相当快速的排序,但是我无法让它与我的warranty_time字段一起使用。我怀疑可能是因为cake将$ interval视为String,而不是int或其他数值数据类型。

我认为好像看到$ interval作为'数字'返回,例如'01119'是否可以根据它对数组进行排序,然后在视图中进行格式化?这样做的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法可能是在数据库中 - 类似这样:

$data = $this->MyModel->find('all', array('order' => 
    array('end_date - start_date' => 'DESC')));

显然这对你来说不是正确的计算方法,但你应该能够使用像MySQL的DATE_ADD这样的方法来计算保修结束日期等。

希望这有帮助。