将大数组(对象图)转换为必要的较小数组
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_id
、SELECT 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());
希望这能为您指明正确的方向!
我有一个实体 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_id
、SELECT 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());
希望这能为您指明正确的方向!