Php 将大数组(对象图)转换为所需的较小数组
我有一个实体跟踪,它处理用户实体实例之间的许多关系。相关表的列如下所示: 跟随(id、跟随者id、跟随者id) 当我执行以下查询时(为了获得特定用户的追随者): 它(通常)给我的结果如下: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
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
及其回调时,我从你那里学到了很多东西