如何在多对一关系中不使用 select 字段
How to not select fields in Many to One relations
在 Symfony 4 项目中,我有一个名为 rendezvous
的实体,该实体通过 ManytoOne 关系链接到其他实体。这些实体之一是 user
,我不想将用户数据与结果一起发送。我如何 select 除了 user
字段之外的所有字段与 doctrine 查询生成器?将关系放在 user
实体中而不是放在 rendezvous
实体中更好吗?
这是我的实体:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\RendezvousRepository")
* @ORM\Table("rendezvous")
*/
class Rendezvous
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User")
*/
private $user;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Immeuble")
*/
private $immeuble;
/**
* @ORM\Column(type="datetime")
*/
private $creation_date;
}
这是我的查询构建器,return 所有 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
语句将覆盖任何以前 selected 的项目,因此您可以准确地拉出您想要的字段(与 addSelect 相反,它不会覆盖以前对 select 的调用). Documentation.
如果您只需要有关 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();
}
在 Symfony 4 项目中,我有一个名为 rendezvous
的实体,该实体通过 ManytoOne 关系链接到其他实体。这些实体之一是 user
,我不想将用户数据与结果一起发送。我如何 select 除了 user
字段之外的所有字段与 doctrine 查询生成器?将关系放在 user
实体中而不是放在 rendezvous
实体中更好吗?
这是我的实体:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\RendezvousRepository")
* @ORM\Table("rendezvous")
*/
class Rendezvous
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User")
*/
private $user;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Immeuble")
*/
private $immeuble;
/**
* @ORM\Column(type="datetime")
*/
private $creation_date;
}
这是我的查询构建器,return 所有 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
语句将覆盖任何以前 selected 的项目,因此您可以准确地拉出您想要的字段(与 addSelect 相反,它不会覆盖以前对 select 的调用). Documentation.
如果您只需要有关 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();
}