Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将大数组(对象图)转换为所需的较小数组_Php_Sql_Symfony_Doctrine_Dql - Fatal编程技术网

Php 将大数组(对象图)转换为所需的较小数组

Php 将大数组(对象图)转换为所需的较小数组,php,sql,symfony,doctrine,dql,Php,Sql,Symfony,Doctrine,Dql,我有一个实体跟踪,它处理用户实体实例之间的许多关系。相关表的列如下所示: 跟随(id、跟随者id、跟随者id) 当我执行以下查询时(为了获得特定用户的追随者): 它(通常)给我的结果如下: array (size=4) 0 => object(Members\Bundle\ManagementBundle\Entity\Follow)[347] private 'follower' => object(Members\Bund

我有一个实体跟踪,它处理用户实体实例之间的许多关系。相关表的列如下所示:

跟随(id、跟随者id、跟随者id)

当我执行以下查询时(为了获得特定用户的追随者):

它(通常)给我的结果如下:

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 IDENTITY(f.follower) AS f1_id, IDENTITY(f.followee) AS f2_id FROM MembersManagementBundle:Follow f WHERE p.followee = :wee
$arr = array_map(function($row) { return $row['f1_id']; }, $query->getResult());
我尝试了
选择f.follower\u id
选择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可能看起来像:

array (size=4)
   0 => '2'
   1 => '3'
   .....
SELECT IDENTITY(f.follower) AS f1_id, IDENTITY(f.followee) AS f2_id FROM MembersManagementBundle:Follow f WHERE p.followee = :wee
$arr = array_map(function($row) { return $row['f1_id']; }, $query->getResult());
这是因为DQL和条令在设计上是SQL之上的抽象级别,因此它隐藏了SQL和关系数据库中必须进行的标识映射,以支持对象。因此,在SQL中,您只需要从联接表中选择ID,而在这里,您必须告诉Dority您需要对象的
标识

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

array (size=4)
   0 => '2'
   1 => '3'
   .....
SELECT IDENTITY(f.follower) AS f1_id, IDENTITY(f.followee) AS f2_id FROM MembersManagementBundle:Follow f WHERE p.followee = :wee
$arr = array_map(function($row) { return $row['f1_id']; }, $query->getResult());

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

在此处添加注释-您的
array\u map
的回调可以替换为
current
,您应该会得到相同的结果<代码>数组映射($current',$result)谢谢John的查询。除了类型(string而不是int)之外,它给出的结果与我在进度中提到的大致相同。它实际上更简短,并且可能执行得更快(因为它不涉及查询第二个表)。但特别要感谢PHP代码行(这两种方法都做到了),以及您的答案的编写方式。Thanks@Artamiel,谢谢你的评论。新概念:-)@Artamiel和@John,实际上,当我查阅PHP官方文档阅读
array\u map
及其回调时,我从你那里学到了很多东西