是否可以只填充QueryBuilder查询中的一个字段来获取关系,我的情况是:
$query = $em->createQuery(
'SELECT s FROM IREnterpriseAppBundle:StockItem s
WHERE s.user = :currentUser AND s.deleted = 0
ORDER BY s.id DESC'
)->setParameters(array('currentUser' => $user));
现在,实体StockItem与用户有关系:
/**
* StockItem
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="IREnterprise\AppBundle\Entity\StockItemRepository")
* @ORM\HasLifecycleCallbacks
*
* @ExclusionPolicy("all")
*
*/
class StockItem
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @Expose
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="IREnterprise\UserBundle\Entity\User", inversedBy="stockItems")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
* @Expose
**/
private $user;
}
在上述查询中,整个User对象与stockitem一起被提取,是否可以仅在用户对象上获取/设置单个字段?
由于我在使用@exclusion策略排除其余用户对象时出现问题:JMSSerializerbundle @expose relationship, ignores other entities policies
作为最后的手段,我必须在代码中取消设置用户对象的字段,但这似乎有点迟钝。
答案 0 :(得分:1)
仅可以从相关实体中获取单个字段,但这样做,您将无法保留对结果的任何更改。
如果你没问题,你应该使用JOIN
并指定你想要获取的相关实体中的哪些字段。
如另一个答案所述,您可以使用createQueryBuilder
代替createQuery
。
createQueryBuilder
代码示例:
$result = $em->getRepository('IREnterpriseAppBundle:StockItem')
->createQueryBuilder('s')
->select('s.id, u.id as user_id')
->join('s.user', 'u')
->where('s.user = :currentUser')
->andWhere('s.deleted = 0')
->setParameter('currentUser', $user)
->getQuery()
->getResult();
createQuery
代码示例:
$query = $em->createQuery(
'SELECT s.id, u.id as user_id FROM IREnterpriseAppBundle:StockItem s
JOIN s.user u
WHERE s.user = :currentUser AND s.deleted = 0
ORDER BY s.id DESC'
)->setParameters(array('currentUser' => $user));