Symfony2从两个不同的表中获取和排序数据

时间:2014-03-23 12:05:15

标签: symfony doctrine-orm

有人可以帮助我,从两个不同列的表中获取所有数据吗?现在它的工作,但我想按DESC的字段“创建”顺序对所有帖子进行排序。 现在我按ID排序,然后按“创建”字段排序。 这是我的存储库方法

public function getLatestPosts($limit = null)
{

    $queryTopics = $this->getEntityManager()
        ->getConnection()
        ->prepare('select * from topic order by  created  DESC');

    $queryTopics->execute();
    $topics = $queryTopics->fetchAll();

    $queryDiary = $this->getEntityManager()
        ->getConnection()
        ->prepare('select * from diary order by  created  DESC');

    $queryDiary->execute();
    $diaries = $queryDiary->fetchAll();

    $posts = array_merge($topics, $diaries);



    return $posts;
}

架构bd

TABLE  `topic` (
      `topic_id` 
      `topic_title`
      `created` 
    )

    TABLE `diary` (
  `id` 
  `title`
  `comment`
  `height` 
  `weight`
  `created`
)

2 个答案:

答案 0 :(得分:0)

我认为最简单的方法是使用array sorting functions in php,它也应该是最快的方式(服务器时间)来实现它

答案 1 :(得分:0)

好的,我会根据一些假设发布答案,因为我不知道你桌子的确切结构。您提到列不同 - 这可能意味着以下一个或全部:

  • 列标题不同
  • 列数不同;即:一个表的列数多于另一个表

但是,由于您要合并这些结果集,我假设您对它们的处理方式相同 - 例如将它们显示在表中。因此,我们假设两个表具有相同的列数,或者您可以手动选择每个表的列的匹配计数。

换句话说,如果您可以匹配列数,则列名无关紧要,因为您可以执行UNION or a UNION ALL

例如:

SELECT id, name, created FROM topics 
UNION 
SELECT id, title, created FROM diary

请注意,列标题不必匹配。如果要在此结果集上应用ORDER BY,只需使用子查询,然后对其进行排序。例如:

SELECT posts.* FROM (
    SELECT id, name, created FROM topics 
    UNION 
    SELECT id, title, created FROM diary
) AS posts ORDER BY created DESC;

这应该允许你应用你想要的排序标准,不需要在PHP级别上进行数组合并和排序(我假设它会慢一点)。

希望这会有所帮助:)

修改

自从我发布此答案后,您已编辑了问题以添加一些说明。每个表中的列数不匹配。

在这种情况下,您有两个选择:

  1. 明确SELECT每个表中匹配的列数(记住名称不必匹配,只需计数)
  2. 通过在列表较少的表的SELECT查询中添加假“填充”列来“匹配”列数。
  3. 第二个选项的示例,使用NULL填充:

    SELECT 
      topic_id, 
      topic_title, 
      NULL AS comment,
      NULL AS height,
      NULL AS weight,
      created 
    FROM topic
    UNION
    SELECT 
      id, 
      title, 
      comment, 
      height, 
      weight, 
      created 
    FROM diary
    

    不可否认,在我看来,这种方式很有点,但它应该适用于您的用例。