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)