在Symfony 4项目中,我有一个名为rendezvous
的实体,它通过ManytoOne关系与其他实体链接。其中一个实体是user
,我不想将用户的数据与结果一起发送。如何使用原则查询生成器选择除user
字段以外的所有字段?将关系放在user
实体中而不是放在rendezvous
实体中是否更好。
这是我的实体:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity(repositoryClass="AppRepositoryRendezvousRepository")
* @ORMTable("rendezvous")
*/
class Rendezvous
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMManyToOne(targetEntity="AppEntityUser")
*/
private $user;
/**
* @ORMManyToOne(targetEntity="AppEntityImmeuble")
*/
private $immeuble;
/**
* @ORMColumn(type="datetime")
*/
private $creation_date;
}
这是我返回所有rendezvous
的查询生成器:
public function findAllByUser($user){
$qb = $this->createQueryBuilder('rdv');
$qb
->where('rdv.user = :user')
->setParameter('user', $user)
;
return $qb->getQuery()->getResult();
}
编辑:我通过以下DQL查询得到了我想要的结果:
public function findAllByUser($user){
$query = $this->_em->createQuery('SELECT rdv.id, i, rdv.creation_date FROM App:Rendezvous rdv JOIN App:Immeuble i WITH rdv.immeuble=i JOIN App:User u WITH u=:user');
$query->setParameter('user', $user);
return $query->getResult();
}
您可以使用select
语句来指定所需的内容:
public function findAllByUser($user) {
$qb = $this->createQueryBuilder('rdv');
$qb
->select('rdv.id')
->addSelect('rdv.immeuble')
->addSelect('rdv.creation_date')
->where('rdv.user = :user')
->setParameter('user', $user)
;
return $qb->getQuery()->getResult();
}
基本上,select
语句将覆盖任何以前选择的项目,因此您可以精确地提取所需的字段(与 addSelect 相反,它不会覆盖以前的选择调用)。文档。
如果您只需要有关user
的特定信息,则可以执行以下操作:
public function findAllByUser($user) {
$qb = $this->createQueryBuilder('rdv');
$qb
->select('rdv.id')
->addSelect('rdv.immeuble')
->addSelect('rdv.creation_date')
->join('rdv.user', 'u')
->addSelect('u.username')
->where('rdv.user = :user')
->setParameter('user', $user)
;
return $qb->getQuery()->getResult();
}