我怎样才能在蛋糕php中进行sql union?

时间:2011-09-15 13:57:25

标签: sql cakephp union

我必须得到模型的所有关联数据。基本上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查询,它也应该返回关联的表数据......

如何使用蛋糕内置函数获取数据?

2 个答案:

答案 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%适合你 - 你必须修改它 - 但它应该让你开始。

UNION syntax in Cakephp