我有以下实体:原则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