CakePHP查询 - 复杂的AND/OR条件

har*_*ryg 7 php sql cakephp

我试图了解CakePHP的复杂查找条件,并阅读了文档,但我正在努力解决这一问题.

SELECT field1,
       field2
WHERE id = 123456
  AND ((holding_date = Last_day(holding_date)
        AND Month(holding_date) IN(3, 6, 9, 12))
       OR (holding_date = '2013-09-15'))
Run Code Online (Sandbox Code Playgroud)

为了产生上述条件,我的conditions阵列会是什么样子?

AD7*_*six 16

CakePHP条件和sql表达式

虽然问题中的条件并不复杂,但它们触及几个点,这意味着正确定义它们可能很棘手.定义cakephp条件时需要了解的一些事项:

  • 条件被定义为key => value对的数组,因此相同的密钥不能在同一级别上定义两次
  • 具有数字键的数组元素被解释为sql表达式
  • 默认的连接模式是"AND" - 没有必要"AND" => ...在条件中指定
  • OR条件必须具有多个元素.如果它只有一个,则没有错误,否则:或者是什么?

考虑到上述说明,问题中的条件可表示为:

$foo->find('all', array(
    'fields' => array(
        'field1',
        'field2'
    ),
    'conditions' => array(
        'id' => 123456,
        'OR' => array(
            array(
                'holding_date = LAST_DAY(holding_date)',
                'MONTH(holding_date)' => array(3,6,9,12)
            ),
            'holding_date' => '2013-09-15'
        )
    )
));
Run Code Online (Sandbox Code Playgroud)

结果如下:

WHERE 
    `id` = 123456
    AND 
    (
        (
            (holding_date = LAST_DAY(holding_date))  
            AND
            (MONTH(holding_date) IN (3, 6, 9, 12)))
        )
        OR 
        (`holding_date` = '2013-09-15')
    )
Run Code Online (Sandbox Code Playgroud)

注意:空格非常重要=)我最初误读了这个问题只是因为问题sql中的空格不一致.