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

Transform big array (graph of objects) to the necessary smaller array

我有一个实体 Follow 处理 User 实体实例之间的多对多关系。相关 table 的列如下所示:

Follow(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);

您可能需要 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 中,您只需 select 来自连接 table 的 ID,在这里您必须告诉 Doctrine 您想要对象的 IDENTITY

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

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

希望这能为您指明正确的方向!