2014-12-02 275 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應該可以正常工作。