如何不选择多对一关系中的字段

时间:2019-07-15 16:29:54

标签: php symfony doctrine-orm

在Symfony 4项目中,我有一个名为#Value!的实体,该实体通过ManytoOne关系链接到其他实体。这些实体之一是rendezvous,我不想将用户数据与结果一起发送。如何使用学说查询构建器选择user字段以外的所有字段?将关系放在user实体而不是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; }

rendezvous

编辑:通过以下DQL查询,我得到了想要的结果:

public function findAllByUser($user){
      $qb = $this->createQueryBuilder('rdv');

      $qb
        ->where('rdv.user = :user')
        ->setParameter('user', $user)
      ;
      return $qb->getQuery()->getResult();
    }

1 个答案:

答案 0 :(得分:2)

您可以使用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相对,后者不会覆盖以前的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();
}