lundi 22 août 2016

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)