如何在多对一关系中不使用 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();
}