mercredi 10 août 2016

Sélectionner certains champs d'une table avec Doctrine

Si vous voulez sélectionner seulement certains champs d'une table, parmis les champs mappés, vous pouvez utiliser le mot-clef PARTIAL :
<?php /** @Entity */ class Foo { /** @Column(type="integer") */ protected $id; /** @Column(type="string", length=140) */ protected $name; }
<?php use Doctrine\ORM\EntityRepository; class FooRepository extends EntityRepository { public function bar() { $query = $this ->createQueryBuilder('foo') ->select('PARTIAL foo.{id}') ->getQuery(); var_dump($query->getSQL()); return $query->getResult(); } }
Le SQL affiché par var_dump() sera de ce type :
SELECT c0_.id as id_0 FROM foo

Ne pas récupérer les liaisons (oneToMany, etc)


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 :
<?php /** @Entity */ class Foo { /** @Column(type="integer") */ protected $id; /** @Column(type="string", length=140) */ protected $name; /** @OneToMany(targetEntity="Comments", mappedBy="foo") */ protected $comments; }
SELECT c0_.id as id_0, c0_.comments as comments_1 FROM foo

Pour la supprimer réellement, il faut ajouter le hint Query::HINT_FORCE_PARTIAL_LOAD suivant à votre requête :
<?php 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(); } }
SELECT c0_.id as id_0 FROM foo

Documentation à propos des hints
SqlWalker qui gère le hint HINT_FORCE_PARTIAL_LOAD (ligne 705)

Aucun commentaire:

Enregistrer un commentaire