您可以通过 4 种或更多不同的方式来做到这一点……最简单但不推荐使用的是
$this->Model->query($query);
$query 是上述查询。
第二种方法可能不是您想要的,是重做您的 sql 查询,您将得到相同的结果(但不与别名分隔),如下所示:
SELECT * FROM `videos` AS `U1`
WHERE `U1`.`level_id` = '1' AND (`U1`.`submitted_date` > '2011-09-11' OR `U1`.`submitted_date` < '2011-09-11')
ORDER BY submitted_date DESC
LIMIT 0,10
这个查询可以用这样的find轻松完成
$conditions = array(
'Video.level_id'=>1,
'OR' => array(
'Video.submitted_date <'=> '2011-09-11',
'Video.submitted_date >'=> '2011-09-11'
)
);
$this->Video->find('all', array('conditions'=>$conditions))
第三种方式将是 Abba Bryant 所说的方式,在此处详细解释 Union syntax in cakePhp 可以直接构建声明。
第四种方式会更喜欢第一种方式,您必须创建一个具有 beforeFind 函数的行为,并且您必须检查选项是否联合并创建查询或创建类似于第三个选项的内容.
你会用这样的查找来调用它
$this->Video->find('all', array('conditions'=>$conditions, 'union'=> $union));
这将更像是可链接或可包含的行为。
第五个方法是修改你的 cakephp sql 驱动程序......这个,我真的不知道你必须做的改变,但它是一种方法......这个驱动程序负责解释和创建查询,连接到数据库并执行查询...
记住 cakephp find 做必要的检查以防止 SQLInyection 和其他风险......$model->query 不会做这个测试所以要小心