Symfony2 Doctrine Query,仅填充OneToMany Relationship

时间:2015-07-13 19:36:36

标签: symfony doctrine-orm

是否可以只填充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

作为最后的手段,我必须在代码中取消设置用户对象的字段,但这似乎有点迟钝。

1 个答案:

答案 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));
相关问题