Symfony 条令继承:获取结果数组中的子类

Symfony 条令继承:获取结果数组中的子类,symfony,doctrine-orm,Symfony,Doctrine Orm,我正在使用Doctrine2和Symfony2。 我有一个抽象实体Vehicle,它有子实体Car,Boat和飞机 我使用以下请求: $em = $this->getEntityManager(); $qb = $em->createQueryBuilder(); $qb->select('v.id', 'v.name', 'v.color'); $qb->from('MyBundle:Vehicle','v'); return

我正在使用Doctrine2和Symfony2。 我有一个抽象实体
Vehicle
,它有子实体
Car
Boat
飞机

我使用以下请求:

    $em = $this->getEntityManager();
    $qb = $em->createQueryBuilder();

    $qb->select('v.id', 'v.name', 'v.color');
    $qb->from('MyBundle:Vehicle','v');

    return $qb->getQuery()->getResult();
这给了我一个这样的数组:

array
  0 => 
    array
      'id' => 1
      'name' => 'Car#1'
      'color' => 'blue'           
  1 => 
    array
      'id' => 2
      'name' => 'SuperTanker'
      'color' => 'yellow'
  2 => 
    array
      'id' => 3
      'name' => 'Boeing 747'
      'color' => 'white'
$qb->select('v.id', 'v.name', 'v.color', 'TYPE(v)');
我需要的是在结果数组中添加关于每个元素的类名的信息(也可能是鉴别器列的内容)。 它会给出类似于:

array
  0 => 
    array
      'type' => 'Car'  // <-- NEW
      'id' => 1
      'name' => 'Car#1'
      'color' => 'blue'           
  1 => 
    array
      'type' => 'Boat'  // <-- NEW
      'id' => 2
      'name' => 'SuperTanker'
      'color' => 'yellow'
  2 => 
    array
      'type' => 'Aircraft'  // <-- NEW
      'id' => 3
      'name' => 'Boeing 747'
      'color' => 'white'
数组
0 => 
排列
'type'=>'Car'//1
“名称”=>“汽车#1”
“颜色”=>“蓝色”
1 => 
排列
'类型'=>'船'//2
“名称”=>“超级油轮”
“颜色”=>“黄色”
2 => 
排列
'类型'=>'飞机'//3
“名称”=>“波音747”
“颜色”=>“白色”

注意:我知道我可以通过获取完整的
车辆
对象而不是数组(
$qb->select('v');
),然后测试每个对象,以确定它们是否是
某物的
实例;或者我可以使用
get_class($vehicle)但我需要我的请求返回一个数组(我的
车辆
对象很大,在这种情况下,我只需要访问许多
车辆
上的几个属性)。

我认为这是不可能的,至少不是现成的

然而,GitHub上的jasonhofer编写了一个
TYPE()
函数,它正好实现了这一点。看一看:

使用此函数,可以执行如下操作:

array
  0 => 
    array
      'id' => 1
      'name' => 'Car#1'
      'color' => 'blue'           
  1 => 
    array
      'id' => 2
      'name' => 'SuperTanker'
      'color' => 'yellow'
  2 => 
    array
      'id' => 3
      'name' => 'Boeing 747'
      'color' => 'white'
$qb->select('v.id', 'v.name', 'v.color', 'TYPE(v)');
尚未测试此代码,但它似乎有效


希望这有帮助。

部分选择如何?您仍然可以选择少数列并将结果格式化为对象。更多信息-谢谢你的信息,这似乎是我的问题的答案。“似乎”,因为我也没有测试代码。我对我的代码进行了一些重构,然后我更聪明地处理了尽可能多的请求。