cakephp复杂查询多个'OR'条件

时间:2012-12-15 08:41:35

标签: sql cakephp

我想用cakephp进行这样的查询:

WHERE text LIKE '%keyword%' 
AND 
(
    (text LIKE '%something%') 
    OR (text LIKE '%something%') 
    OR (...)
) 
AND 
(
    (text LIKE '%other%') 
    OR (text LIKE '%other%') 
    OR (...)
) 
NOT 
(
    (text LIKE '%dont include%') 
    OR (text LIKE '%dont include%') 
    OR (...)
)

这是我的条件代码:

$conditions = array
(
    'Tweet.text LIKE' => '%keyword%',
    'AND' => array(
        array(
            'OR' => array(
                // topic
                array('Tweet.text LIKE' => '%something%'),
                array('Tweet.text LIKE' => '%something%')
            )
        ),
        array(
            'OR' => array(
                // sentiment
                array('Tweet.text LIKE' => '%other%'),
                array('Tweet.text LIKE' => '%other%')
            )
        )
    ),
    'NOT' => array(
        array('Tweet.text LIKE' => '%dont include%'),
        array('Tweet.text LIKE' => '%dont include%')
    )
);

我用Debugger :: dump()方法显示结果,结果只是使用了最后一个'OR'条件,而不是两个'OR'条件:

array(
    'Tweet.text LIKE' => '%keyword%',
    'OR' => array(
        (int) 0 => array(
            'Tweet.text LIKE' => '%other%'
        ),
        (int) 1 => array(
            'Tweet.text LIKE' => '%other%'
        )
    ),
    'NOT' => array(
        (int) 0 => array(
            'Tweet.text LIKE' => '%dont include%'
        ),
        (int) 1 => array(
            'Tweet.text LIKE' => '%dont include%'
        )
    )
)

我的问题是,如何使用'OR'条件进行查询?

请尽快回复..提前致谢:)

1 个答案:

答案 0 :(得分:13)

尝试以下方法:

$conditions = array(
    'Tweet.text LIKE' => '%aa%',  //implied and
    array( //implied and
        'or' => array(
            array('Tweet.text LIKE' => '%11%'),
            array('Tweet.text LIKE' => '%22%'),
            array('Tweet.text LIKE' => '%33%'),
            ...
        )   
    ),
    array( //implied and
        'or' => array(
            array('Tweet.text LIKE' => '%123%'),
            array('Tweet.text LIKE' => '%456%'),
            array('Tweet.text LIKE' => '%789%'),
            ...
        )   
    )
    'not' => array(
        'or' => array(
            array('Tweet.text LIKE' => '%x%'),
            array('Tweet.text LIKE' => '%y%'),
            array('Tweet.text LIKE' => '%z%'),
            ...
        )   
    )
)

将是

text LIKE aa 
    AND ( either 11, 22, 33 ) 
    AND (either 123, 456, 789) 
    BUT NOT (x || y || z)`

未指定orandnot的任何数组均为and。无需手动指定。