Si vous voulez sélectionner seulement certains champs d’une table parmis les champs mappés, vous pouvez utiliser le mot-clé PARTIAL
:
/** @Entity */
class Foo
{
/** @Column(type="integer") */
protected ?int $id = null;
/** @Column(length=140) */
protected ?string $name = null;
}
use Doctrine\ORM\EntityRepository;
class FooRepository extends EntityRepository
{
public function bar()
{
$query = $this
->createQueryBuilder('foo')
->select('PARTIAL foo.{id}')
->getQuery();
return $query->getResult();
}
}
Le SQL généré :
SELECT c0_.id as id_0 FROM foo
Si on ajoute une liaison quelconque à l’entité Foo
, même avec PARTIAL
dans la requête cette liaison sera ajoutée dans la requête :
/** @Entity */
class Foo
{
/** @Column(type="integer") */
protected ?int $id = null;
/** @Column(length=140) */
protected ?string $name = null;
/** @OneToMany(targetEntity="Comments", mappedBy="foo") */
protected Collection $comments;
public function __construct()
{
$this->comments = new ArrayCollection();
}
}
En appelant FooRepository::bar()
de l’exemple précédent on obtient cette requête SQL :
SELECT c0_.id as id_0, c0_.comments as comments_1 FROM foo
Pour supprimer c0_.comments as comments_1
il faut ajouter le hint Query::HINT_FORCE_PARTIAL_LOAD
suivant à votre requête :
use Doctrine\ORM\Query;
use Doctrine\ORM\EntityRepository;
class FooRepository extends EntityRepository
{
public function bar()
{
$query = $this
->createQueryBuilder('foo')
->select('PARTIAL foo.{id}')
->getQuery();
$query->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
return $query->getResult();
}
}
La requête SQL générée :
SELECT c0_.id as id_0 FROM foo