CakePHP 在 2 个日期记录之间搜索
Posted
技术标签:
【中文标题】CakePHP 在 2 个日期记录之间搜索【英文标题】:CakePHP Search between 2 Date Records 【发布时间】:2012-08-10 09:51:20 【问题描述】:我正在构建一个小型 Web 应用程序,让用户可以预订办公室和设备。对于预订,他们输入开始和结束日期。
当用户试图找出是否有任何(例如)汽车在 2012 年 10 月 23 日可用,并且数据库保存开始:2012-10-20
和结束:2012-10-25
的预订日期记录(比如说)所有的汽车,我如何在搜索中包含我的日期条目之间的所有日期?
$date
变量从日期搜索表单字段中获取它的值。
不幸的是,这不起作用,我不知道如何使用 daysAsSql 进行此查询:
$conditions = array(
'conditions' => array(
'? BETWEEN ? AND ?' => array($date,'Equipment.date_start','Equipment.date_end'),
)));
$this->set('equipments', $this->Equipment->find('all', $conditions));
【问题讨论】:
你应该检查日期不应该在startdate
和enddate
之间。 nuts-and-bolts-of-cakephp.com/2008/06/30/…
根据您提供的链接,我将代码更改为:` '?之间 ?和 ?' => array($date,'Equipment.date_start','Equipment.date_end'), ` 不幸的是,这没有任何作用……
【参考方案1】:
有一个更简单的解决方案,但感谢您的帮助:
(作为查找中的一个条件:)
array('Equipment.date_start <= ' => $date,
'Equipment.date_end >= ' => $date
),
【讨论】:
【参考方案2】:如果你有一个日期并且你想使用 BETWEEN
$date_start = start date;
$date_end = date_end;
$conditions = array(
'conditions' => array(
'date(Equipment.create) BETWEEN ? AND ?' => array($date_start, $date_end),
)));
$this->set('equipments', $this->Equipment->find('all', $conditions));
如果您有 From AND To,就会出现这种情况
你的情况
$date_start = start date;
$date_end = date_end;
$conditions = array(
'conditions' => array(
'Equipment.start_date >=' => array($date_start),
'Equipment.end_date <=' => array($date_end)
));
$this->set('equipments', $this->Equipment->find('all', $conditions));
【讨论】:
【参考方案3】:这里是CakePHP BETWEEN
查询示例。
我将我的数组定义为变量,然后在我的 CakePHP find 函数调用中使用这些变量:
// just return these two fields
$fields = array('uri', 'page_views');
// use this "between" range
$conditions = array('Event.date BETWEEN ? and ?' => array($start_date, $end_date));
// run the "select between" query
$results = $this->Event->find('all',
array('fields'=>$fields,
'conditions'=>$conditions));
Ref from
【讨论】:
【参考方案4】:$start = date('Y-m-d');
$end = date('Y-m-d', strtotime('+1 month'));
$conditions = array('Event.start <=' => $end, 'Event.end >=' => $start);
$this->Event->find('all', array('conditions' => $conditions));
【讨论】:
我只是好奇 - 在文档、api 或代码中找不到关于dateRange
或开始/结束的任何信息,能否提供链接?
nuts-and-bolts-of-cakephp.com/2008/06/30/… 也参考这个【参考方案5】:
如果您使用的是 cakephp 2.0,这就是答案 http://book.cakephp.org/2.0/en/core-libraries/helpers/time.html#TimeHelper::daysAsSql
如果您使用的是 cakephp 1.3,您可以使用 TimeHelper,只需导入它并使用与此处文档中的示例相同的功能 http://book.cakephp.org/1.3/en/view/1471/Formatting
【讨论】:
谢谢,我知道这些文档,但我无法让 daysAsSql 使用它。 (我在 CakePHP 2 上)【参考方案6】:您不能将数据库列与此 BETWEEN
-syntax 一起使用。如果您在数组中分配字符串,CakePHP 将引用它们。数值相同,具体取决于您的数据库设置。
CakePHP 将根据数据库中的字段类型引用数值。 – 见http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions
如果您仍想使用BETWEEN
,您可以将查询写入数组键,因为 CakePHP 不会转义键,只会转义值。
CakePHP 只对数组值进行转义。您应该绝不将用户数据放入密钥中。这样做会使您容易受到 SQL 注入的攻击。 – 见http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions
关于你的问题:
$this->Model->find('all', array(
'conditions' => array(
'"YYYY-MM-DD" BETWEEN Model.date_start AND Model.date_end',
),
));
您甚至可以使用 mysql 日期和时间函数:
$this->Model->find('all', array(
'conditions' => array(
'CURDATE() BETWEEN Model.date_start AND Model.date_end',
),
));
如果您使用日期/时间函数,请不要引用它们。如果您使用特定日期,请将其放在引号中。
【讨论】:
以上是关于CakePHP 在 2 个日期记录之间搜索的主要内容,如果未能解决你的问题,请参考以下文章
CakePHP 1.2 应用程序具有非常规的 Cake 路径抛出错误
调用未定义的方法 Cake\ORM\Entity::query() CakePhp