我对Cake PHP框架相对较新,并尝试了很少的东西。我做了一个博客数据库。我试图使用debug()函数查看特定年份中发布的一系列帖子。 我在帖子模型中写了以下函数。
function findByYear($year = null){
$date = $year.'-01-01 00:00:00';
$end_date = $year.'-12-31 23:59:59';
return $this->find('all',array('conditions'=>array('DATE(Post.date)'=>'>'.$date,'DATE(Post.date)'=>'<'.$end_date)));
}
然后我在posts_controller中包含了一个read函数。
function read($year=null) {
if (!$year) {
$this->Session->setFlash('Please supply a year');
$this->redirect(array('action'=>'index'));
}
$this->set('posts',$this->Post->findByYear($year));
}
最后,创建了一个读取视图文件(read.ctp)并在其中包含了调试功能
<?php debug($posts) ?>
现在,问题是当我在URL中启动操作时,我得到一个空数组: http://localhost/posts/read/2009 我已经有3个帖子,但我没有在阵列中获得任何帖子。 我错过了什么?
答案 0 :(得分:2)
我认为问题是“&lt;”的位置和“&gt;”运营商,因为他们必须处于“关键”方面,而不是“价值”方面。变化
'DATE(Post.date)' => '>'.$date
到
'DATE(Post.date) >' => $date
同样适用于其他条件。
答案 1 :(得分:1)
conditions数组可以是混合类型(也就是说它可以包含字符串以及数组)。将基于日期的条件表示为字符串可能更容易,因为您使用的是范围而不是日期上的完全匹配。例如:
$conditions = array();
$conditions[] = array('Post.id'=>$myId);
$conditions[] = 'DATE(Post.date) > '.$date;
$posts = $this->find('all',array('conditions'=>$conditions));
(一个辅助的好处是,凡人都可以轻松解析。)
另一点 - 您应该考虑使用mktime()
函数来构建日期字符串,而不是简单地将参数连接到字符串的前面并希望最好。这有助于提供$year
参数的一些基本验证以及降低获得意外结果的可能性的双重目的。例如:
$date = mktime(0,0,0,1,1,$year); //$year.'-01-01 00:00:00';
$end_date = mktime(23,59,59,12,31,$year); //$year.'-12-31 23:59:59';
这将以unix时间戳格式设置两个日期值,这是你想要的,所以从几乎每个角度都是胜利。
祝你好运!