限制关系实体symfony2中返回的列

时间:2016-02-25 00:03:14

标签: symfony doctrine-orm doctrine-query

是否可以过滤实体并在symfony2中只显示几列? 我想我可以为此做一个自定义查询,但它似乎有点脏,我相信有更好的解决方案。 例如,我在下面有我的变量$ createdBy,它包含一些不应该在这个父实体中显示的数据,如密码等......

/**
 * @var Customer
 *
 * @ORM\ManyToOne(targetEntity="MyCompany\Bundle\CustomerBundle\Entity\Customer")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="created_by", referencedColumnName="id", nullable=false)
 * })
 */
protected $createdBy;

所以我需要显示我的Customer实体,但仅包含id和name等字段。 编辑: 我已经有了一个Project实例,带有我的createdBy字段的实体,我想抓住我的客户数据'格式化'为这个实体,而不是返回太多字段,如密码......

由于

1 个答案:

答案 0 :(得分:0)

这对我来说听起来像是预期的行为。该学说文档似乎意味着急切的提取只有一个层次。

根据文件:

  

每当您查询具有持久关联的实体时   这些关联被映射为EAGER,它们将自动成为   与被查询的实体一起加载,因此立即加载   适用于您的应用程序。

http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#by-eager-loading

被查询的实体渴望创建它,因此它将被填充。

绕过您可以在您的实体存储库中创建一个方法,如下所示:

// join entities and load wanted fields
     public function findCustom()
        {
            return $this->getEntityManager()
                ->createQuery(
                    'SELECT p FROM AppBundle:Product p ORDER BY p.name ASC'
                )
                ->getResult();
        }

希望这可以帮助你

尝试这个并告诉我它是否有效,你应该填写正确的存储库名称

'XXXXBundle:CustomerYYYY','c'

public function findUser($user_id){

 $qb = $this->_em->createQueryBuilder('c')
            ->select(array('c', 'cb.id', 'cb.name'))
            ->from('XXXXBundle:Customer', 'c')
            ->where('c.id <> :id')
            ->leftJoin('c.createdBy', 'cb')
            ->setParameter('id', $user_id)->getQuery();
if ($qb != null)
            return $qb->getOneOrNullResult();
        return null;
}