我必须得到模型的所有关联数据。基本上UNION查询如下:
SELECT * FROM `videos` AS `U1`
WHERE `U1`.`level_id` = '1' AND `U1`.`submitted_date` > '2011-09-11'
UNION
SELECT * FROM `videos` AS `U2`
WHERE `U2`.`level_id` = '1' AND `U2`.`submitted_date` < '2011-09-11'
ORDER BY submitted_date DESC
LIMIT 0,10
所以我用的时候
$this->Video->find('all')-->
我得到了相关表数据的所有结果。
现在我想使用UNION SQL查询,它也应该返回关联的表数据......
如何使用蛋糕内置函数获取数据?
答案 0 :(得分:4)
你可以用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
使用像这样的
可以轻松完成此查询$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))
第三种方式将是阿巴布莱恩特谈论的方式,详细解释Union syntax in cakePhp直接构建声明。
第四种方式会更喜欢第一种方式,你必须创建一个具有beforeFind函数的行为,你必须检查一个选项union并创建查询或创建类似第三个选项的东西。
你会用这样的发现来称呼它
$this->Video->find('all', array('conditions'=>$conditions, 'union'=> $union));
这将更像是可链接或可包含的行为。
fith方式是修改你的cakephp sql驱动程序......这一个,我真的不知道你必须做的改变,但它是一种方法来达到这个...这个驱动程序是负责任的解释并创建查询,连接到db并执行查询...
请记住,cakephp发现需要进行检查以防止SQLInyection和其他风险...... $model->query
不会执行此测试,所以要小心
答案 1 :(得分:0)
这个问题在这里使用连接和一些直接数据源访问来构建可以通过find方法使用的联合查询。
这是一项工作,代码不是100%适合你 - 你必须修改它 - 但它应该让你开始。