将大数组(对象图)转换为必要的较小数组

时间:2015-11-10 17:45:12

标签: php sql symfony doctrine dql

我有一个实体Follow,用于处理User实体实例之间的manyToMany关系。相关表的列如下所示:

  

关注(id,follower_id,followee_id)

当我执行以下查询时(为了获取特定用户的关注者):

       $em= $this->entityManager;

       $query = $em->createQuery(
            'SELECT f
            FROM MembersManagementBundle:Follow f               
            WHERE p.followee = :wee'
            )->setParameter('wee', 1);

       $n= $query->getResult();

它(通常)给我一个结果,如:

array (size=4)
  0 => 
    object(Members\Bundle\ManagementBundle\Entity\Follow)[347]
        private 'follower' => 
             object(Members\Bundle\ManagementBundle\Entity\User)[283]
                 protected 'id' => int 2
                 .........
        private 'followee' => 
             object(Members\Bundle\ManagementBundle\Entity\User)[283]
                 protected 'id' => int 1
                 .........
  1 => 
    ..........

虽然我想有类似的东西:

array (size=4)
   0 => '2'
   1 => '3'
   .....

我尝试了SELECT f.follower_idSELECT f.follower.id,他们给了我语法错误。

它需要更高级的DQL和查询构建器知识,而不是我和我正在寻求的通常指导。提前谢谢。

进度:

我设法让结果数组更小:

array (size=4)
  0 => 
    array (size=1)
      'id' => int 2
  1 => 
    array (size=1)
      'id' => int 3
  2 => 
    array (size=1)
      'id' => int 4
  3 => 
    array (size=1)
      'id' => int 5

但在我原来的问题中没有提及。如何删除主数组中的数组?

$query = $em->createQuery(
                'SELECT u.id
                FROM MembersManagementBundle:Follow p, MembersManagementBundle:User u            
                WHERE p.followed = :wee
                AND u.id= p.follower'
                )->setParameter('wee', 1);

1 个答案:

答案 0 :(得分:1)

你可能想要IDENTITY() DQL函数,它是2.4中的新函数,不幸的是,它隐藏在documentation中(检查该部分的最后一个条目)。

所以你的DQL可能看起来像:

SELECT IDENTITY(f.follower) AS f1_id, IDENTITY(f.followee) AS f2_id FROM MembersManagementBundle:Follow f WHERE p.followee = :wee

原因是因为DQL和Doctrine在设计上是一个高于SQL的抽象级别,所以它隐藏了你在SQL和关系数据库中必须做的身份映射,而不是对象。因此,在SQL中,您只需从连接表中选择ID,在这里您必须告诉Doctrine您需要IDENTITY个对象。

此外,由于此DQL未返回实体并且是部分查询(documentation),因此您需要执行另一个后处理步骤来获取数组,例如:

$arr = array_map(function($row) { return $row['f1_id']; }, $query->getResult());

希望这能指出你正确的方向!

相关问题