0

第一次发布问题,我有一点蛋糕经验,但我远非精通。在我的模型 - 产品中,我使用 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 视为字符串,而不是 int 或其他数字数据类型。

我认为似乎 $interval 被返回为“数字”,例如“01119”,是否可以根据该数字对数组进行排序,然后在视图中进行格式化?这样做的最佳方法是什么?

4

1 回答 1

0

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

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

显然,这对您来说不是正确的计算,但是您应该能够使用 MySQL 的 DATE_ADD 之类的东西来计算保修结束日期等。

希望这可以帮助。

于 2013-05-08T14:03:24.173 回答