2014-12-02 121 views
3

我有以下实体:原则2:选择实体领域,包括相关领域

/** 
* @ORM\Table(name="Employee") 
* 
@ORM\Entity(repositoryClass="Project\BackendBundle\Entity\Repository\EmployeeRepository") 
*/ 
class Employee 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Division") 
    * @ORM\JoinColumn(name="division_id", referencedColumnName="id") 
    * @Expose 
    **/ 
    private $division; 

    /** 
    * @ORM\ManyToOne(targetEntity="Position") 
    * @ORM\JoinColumn(name="position_id", referencedColumnName="id") 
    */ 
    private $position; 

    ..... 
} 

随着我的REST API,我想创建一个名为“域”的过滤器,在这里我把 逗号分隔的列表我想要检索的实体字段。另外我 希望能够把关联的领域。因此请求看起来 这样的:

/api/employee?fields=id,division 

我检查这些领域,如果他们在实体领域或关联映射存在。

每一个相关的字段添加到查询就像这样:

foreach ($this->assoc as $key => $mapping) { 
    $queryBuilder 
     ->addSelect(substr($key, 0, 1) . ' AS ' . $key) 
     ->leftJoin(
      $mapping['targetEntity'], 
      substr($key, 0, 1), 
      \Doctrine\ORM\Query\Expr\Join::WITH, 
      substr($key, 0, 1) . ' = u.' . $key 
     ); 
} 

从上面我得到以下DQL请求:

SELECT u.id, d AS division FROM Project\BackendBundle\Entity\Employee u LEFT JOIN Project\BackendBundle\Entity\Division d WITH d = u.division 

一切都很好,我得到预期的结果(var_dump() ):

array (size=1) 
    0 => 
    array (size=2) 
     'division' => 
     object(Project\BackendBundle\Entity\division)[645] 
      private 'id' => int 20 
      private 'name' => string 'division1' (length=9) 
     'id' => int 890 

现在,如果我多了一个相关的字段添加到我的requeste d字段:

/api/employee?fields=id,division,position 

我得到以下DQL:

SELECT u.id, d AS division, p AS position FROM Project\BackendBundle\Entity\Employee u LEFT JOIN Project\BackendBundle\Entity\Division d WITH d = u.division LEFT JOIN Project\BackendBundle\Entity\Position p WITH p= u.position 

结果现在看起来是这样的:

array (size=2) 
    0 => 
    array (size=1) 
     'division' => 
     object(Project\BackendBundle\Entity\Kategorija)[672] 
      private 'id' => int 20 
      private 'name' => string 'division1' (length=9) 
    1 => 
    array (size=2) 
     'position' => 
     object(Project\BackendBundle\Entity\Position)[629] 
      private 'id' => int 15 
      private 'name' => string 'Manager' (length=7) 
     'id' => int 890 

的问题是,现在一个实体的结果在于两个数组而不是 之一。

预期的结果是:

array (size=1) 
    0 => 
    array (size=3) 
     'division' => 
     object(Project\BackendBundle\Entity\Kategorija)[672] 
      private 'id' => int 20 
      private 'name' => string 'division1' (length=9) 
     'position' => 
     object(Project\BackendBundle\Entity\Position)[629] 
      private 'id' => int 15 
      private 'name' => string 'Manager' (length=7) 
     'id' => int 890 

我所丢失或做错了什么?

编辑

我想通了,我得到了场错误的方式。我开始使用PARTIAL功能。

根据要求/api/employee?fields=id,division的DQL看起来是这样的:

SELECT partial u.{id,division} FROM Project\BackendBundle\Entity\Employee u 

,其结果是:

array (size=1) 
     0 => 
     array (size=3) 
      'division' => 
      object(Project\BackendBundle\Entity\Kategorija)[672] 
       private 'id' => int 20 
       private 'name' => string 'division1' (length=9) 
      'position' => 
      object(Project\BackendBundle\Entity\Position)[629] 
       private 'id' => int 15 
       private 'name' => string 'Manager' (length=7) 
      'id' => int 890 

你可以看到,我得到的请求的实体字段+所有相关领域,也不管我只请求了一个关联字段。

如何让这些关联的字段也被过滤?

+0

或者您可以只选择需要的员工(不需要复杂的查询),获取一个请求的字段名称数组,然后将其传递给JMS序列化程序(您最可能使用的)作为序列化组。此外,您的实体可能会在该属性中定义这些组,这些位置将具有组“位置”,ID将具有组“ID”等等。这种方式序列化程序将只获得您的实体,你作为组传递的属性 – nikita2206 2014-12-05 10:17:56

回答

0

你用什么命令来执行DQL?当你在DQL语句中选择'division'或'position'时,它将把它当作一个完整的对象。如果你选择division.id和position.id应该可以正常工作。