【问题标题】:How can I do sql union in cake php?如何在 cake php 中进行 sql union?
【发布时间】:2011-09-15 13:57:25
【问题描述】:

我必须获取模型的所有关联数据。基本上 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-&gt;Video-&gt;find('all')--&gt;我得到了关联表数据的所有结果。

现在我想使用 UNION SQL 查询,它也应该返回关联的表数据...

知道如何使用 cake 内置函数获取数据吗?

【问题讨论】:

    标签: sql cakephp union


    【解决方案1】:

    您可以通过 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-&gt;query 不会做这个测试所以要小心

    【讨论】:

    • 感谢4种类型的信息。实际上我想展示的是:-第一个联合查询应该搜索在过去 4 天内具有最大 cmets 的视频,即按降序显示 cmets 数量的视频。第二个联合查询将搜索其余视频具有最大 cmet 的视频。我现在清楚了吗?
    • 所以查询现在是 [[ SELECT * FROM videos AS U1 WHERE U1.level_id = '1' AND U1.submitted_date > '2011- 09-11' ORDER BY cmets DESC UNION SELECT * FROM videos AS U2 WHERE U2.level_id = '1' AND U2.submitted_date
    • @saikat 正如我之前告诉你的那样,你可以使用上述方法之一来执行此操作,或者你可以在两个不同的选择中执行此操作,记住不要局限于框架,还要记住要做什么该框架为您执行(sqlinyection 测试等)。此外,您应该在其中一个中使用 =,否则您将错过一天。
    • 我重新阅读了您的 sql 查询,您只能使用联合来合并结果。因此,将两个查询分开然后合并结果是完全可以接受的......(使用 array_merge_recursive 或类似的东西可能会起作用)
    • 谢谢,但是使用 array_merge 合并结果很好,很好。但现在的问题是分页。我应该如何进行分页。两个查询中分页第二页的偏移量应该是多少...我有点困惑...请您帮忙
    【解决方案2】:

    这里的这个问题使用连接和一些直接的数据源访问来构建一个可以通过 find 方法使用的联合查询。

    这需要一些工作,而且代码不会 100% 适合您 - 您必须对其进行修改 - 但它应该可以帮助您入门。

    UNION syntax in Cakephp

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 2011-12-20
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多