Cakephp - 使用AND和OR条件搜索

时间:2013-02-05 04:35:33

标签: php cakephp search

我正在尝试实现一个搜索,其中所有字段都是可选的,所以我必须根据用户输入过滤我的结果,但我仍然坚持如何实现这一目标......

搜索字段如下

1)通过电子邮件搜索:

2)按名称搜索:

3)按注册日期进行搜索:(即从日期到日期)

选项1)和3)能够实现,因为只需要一个AND条件。

问题是选项2)name应该匹配first_name或last_name,所以我必须有一个OR条件,我无法找到正确的方法来做它..

注意:所有字段都是可选的......

继承我的代码片段....

$conditions = array();

if(!empty($this->request->data['searchbyemail'])) {

   $conditions[] = array('User.username' => $this->request->data['searchbyemail']);
}

if(!empty($this->request->data['regfromdate']) &&
   !empty($this->request->data['regtodate'])) {

    $conditions[] = array('User.created BETWEEN ? AND ?' => 
    array($this->request->data['regfromdate'], $this->request->data['regtodate']));
}

if(!empty($this->request->data['searchbyname'])) {

    $conditions[] = array(
'OR' => array(
        'User.first_name' => $this->request->data['searchbyname'],
        'User.last_name' => $this->request->data['searchbyname']

                ));
}


$this->paginate = array('conditions' => $conditions);
$this->set('users', $this->paginate());

我想要实现的查询应该是这样的

SELECT * FROM  `users` AS `User`
WHERE `User`.`username` = 'a'
AND `User`.`created`
BETWEEN '2013-02-01'
AND '2013-02-05'
AND ((`User`.`first_name` LIKE '%b%')) OR ((`User`.`last_name` LIKE '%b%'))

能够在cakephp中生成此查询但是它的静态,我正在寻找一种动态方式来生成此查询,因为搜索字段是可选的,查询应该根据用户输入进行更改.....

1 个答案:

答案 0 :(得分:3)

要将LIKE运算符与%通配符一起使用,您可以:

        'OR' => array(
            'User.first_name LIKE' => "%" . $this->request->data['searchbyname'] . "%",
            'User.last_name LIKE' => "%" . $this->request->data['searchbyname'] . "%"
        ),