我有以下實體:原則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
你可以看到,我得到的請求的實體字段+所有相關領域,也不管我只請求了一個關聯字段。
如何讓這些關聯的字段也被過濾?
或者您可以只選擇需要的員工(不需要複雜的查詢),獲取一個請求的字段名稱數組,然後將其傳遞給JMS序列化程序(您最可能使用的)作爲序列化組。此外,您的實體可能會在該屬性中定義這些組,這些位置將具有組「位置」,ID將具有組「ID」等等。這種方式序列化程序將只獲得您的實體,你作爲組傳遞的屬性 – nikita2206 2014-12-05 10:17:56