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


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

我有一个实体Follow,它处理用户实体实例之间的许多ToMany关系。相关表格的列看起来像:

跟随(id,follower_id,Follow ee_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中是新的,但不幸的是,它被隐藏在文档中(请查看该部分的最后一项)。

所以你的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没有返回实体,并且是一个部分查询(文档),所以您需要执行另一个后处理步骤来获得您的数组,比如:

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

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