Doctrine 2 addSelect только для некоторых полей - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь получить запрос с addSelect в отношении ManyToMany, чтобы получить только некоторые поля отношения. У меня есть две следующие сущности:

class Maquina
{
    public function __construct() {
        $this->clusters = new ArrayCollection();
    }
    
    /**
     * @ORM\Column(name="nombre", type="string", length=150)
     */
    private $name;
    
    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Cluster", inversedBy="maquinas")
     * @ORM\JoinTable(name="cluster_maquina",
     *      joinColumns={@ORM\JoinColumn(name="maquinaId", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="clusterId", referencedColumnName="id")}
     *      )
     */
    private $clusters;
}

class Cluster
{
    public function __construct(){
        $this->maquinas = new ArrayCollection();
    }
    
    /**
     * @ORM\Column(name="nombre", type="string", length=150)
     */
    private $name;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Maquina", mappedBy="clusters")
     */
    private $maquinas;
}

Я хочу получить результат запроса с данными хоста, включая имена кластеров, которые есть у хоста. Я пробую следующее (в примере, где хост имеет 2 кластера)

$qb = $this->em->createQueryBuilder();
$qb->select('M')
   ->from('App\Entity\Maquina', 'M')
   ->where('M.id = 1')
   ->leftJoin('M.clusters', 'C')
   ->addSelect('C');
$qb->getQuery()->getArrayResult();

Я получаю результат массива, например:

Array ( [id] => 1 [name] => HostName [clusters] => Array ( [0] => Array ( [id] => 1 [name] => cluster1 ) [1] => Array ( [id] => 2 [name] => cluster2 ) ) ) 

Но я бы хотел получить только имя поля кластеров в addSelect:

   Array ( [id] => 1 [name] => HostName [clusters] => Array ( [0] => Array ( [name] => cluster1 ) [1] => Array ( [name] => cluster2 ) ) ) 
    or 
   Array ( [id] => 1 [name] => HostName [clusters] => Array ( [0] => cluster1 [1] => cluster2  )

Я пробую:

$qb = $this->em->createQueryBuilder();
    $qb->select('M')
       ->from('App\Entity\Maquina', 'M')
       ->where('M.id = 1')
       ->leftJoin('M.clusters', 'C')
       ->addSelect('C.name');
    $qb->getQuery()->getArrayResult();

Но с этим запросом будет 2 результата, по одному для каждого кластера с данными хоста повторяется.

Есть ли способ получить то, что я хочу, без каких-либо логов c вне запроса?

Большое спасибо

...