CakePHP查询-复杂和/或条件
我试图了解CakePHP的复杂查找条件,并且已经阅读了,但是我正在努力处理这一查询CakePHP查询-复杂和/或条件,php,sql,cakephp,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')) 要生成上述条件,我的条件数组将是什么样子?请尝试
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'))
要生成上述条件,我的条件数组将是什么样子?请尝试以下操作:
$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')
)
)
);
好的,我已经解决了:
$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)
)
)
)
);
CakePHP条件和sql表达式
虽然问题中的条件没有那么复杂,但它们涉及到一些要点,这意味着它们可能很难正确定义。定义cakephp条件时需要知道的一些事情:
- 条件定义为键=>值对数组,因此同一个键不能在同一级别上定义两次
- 具有数字键的数组元素被解释为sql表达式
- 默认连接模式为“和”-不必在条件中指定
”和“=>…
”
- 或条件必须有多个元素。如果它只有一个错误,那么就没有错误,否则:或者什么
考虑到上述注释,问题中的条件可以表示为:
$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中的空格不一致。我不必尝试就知道这是不对的;您已将第一个日期条件之一与或
条件分组在同一数组中。据我所知,当这不是我想要的时,这总是需要满足第一个条件。我的条件是“记录必须在季度的最后一天[前两个条件]或在我指定的日期[最后一个条件]”+1个好答案,但我建议将或规则放在它们自己的数组中。如果密钥重复,PHP不会发出警告,如果您在hold\u date
上有两条规则,则只会使用最后一条规则。@MathewFoscarini不必要的嵌套会使内容难以阅读-因此,在需要时,或者在适当地构建条件时,这样做是一个好主意(对于任何数组键都可以这样说,或
不是特例)。如果保留日期
在两个或比较中,则在中使用更合适(即'holding\u date'=>数组('first','second')
)。是的,回答很好。虽然我自己做到了,但你排除了不必要的“AND”s使其更加简洁。对于空格表示歉意-我不太确定如何将其应用于SQL