8

我试图了解 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'))

要产生上述条件,我的conditions数组会是什么样子?

4

3 回答 3

17

CakePHP 条件和 sql 表达式

虽然问题中的条件并不复杂,但它们涉及一些要点,这意味着它们可能很难正确定义。定义 cakephp 条件时要知道的一些事情:

  • 条件被定义为键 => 值对的数组,因此同一键不能在同一级别上定义两次
  • 具有数字键的数组元素被解释为 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'
        )
    )
));

结果是:

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')
    )

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

于 2013-09-23T14:00:36.987 回答
3

好的,我已经解决了:

$findParams['conditions'] = array(
            'Account.client_id' => '12345',
            'AND' => array(
                'OR' => array(
                    'Holding.holding_date' => '2013-09-15',
                    'AND' => array(
                        'Holding.holding_date = LAST_DAY(Holding.holding_date)',
                        'MONTH(Holding.holding_date)' => array(3,6,9,12)
                        )
                    )
                )
            );
于 2013-09-23T11:08:46.673 回答
1

试试这个:

$params['conditions'] = array(
    '`id`' =>  123456,
    'AND' => array(
        '`holding_date`' => 'LAST_DAY(`holding_date`)',
        'AND' => array(
            'MONTH(holding_date)' => array(3, 6, 9, 12),
            'OR' => array(`holding_date` => '2013-09-15')
        )
    )
);
于 2013-09-23T10:54:29.490 回答