symfony2のDoctrineとEntityManagerは、あなたが説明したように動作します。
データベースからオブジェクトをフェッチすると、DoctrineがSELECT *
自動的に機能します。
さらに、を介していくつかの関連プロパティにアクセスする場合foreign key
、doctrineは遅延読み込みを使用します。つまり、doctrineはすでに方法を知っているため、いくつかのフィールドを取得する方法をクエリに指定する必要はありません。最良のことは、そのフィールドを呼び出すためにクエリが実行されないことです(条件文などに適しています)
質問に戻ると、関心のあるフィールドのみを取得できます。最初のステップはrepository
、クラスオブジェクトのを定義することです。2つ目は、「自分の」フィールドのみを抽出するDQLクエリ(Doctrine Query Language)を作成することです。
User
これは、というクラスと、という関連リポジトリがある例です。UserRepository
<?php
namespace CompanyName\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\Common\Collections\ArrayCollection;
/**
* CompanyName\UserBundle\Entity\User
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="CompanyName\UserBundle\Repository\UserRepository")
*/
class User implements AdvancedUserInterface
{
[...]
ここで「興味深い」部分は
@ORM\Entity(repositoryClass="CompanyName\UserBundle\Repository\UserRepository")
リポジトリのコードは次のとおりです。
<?php
namespace CompanyName\UserBundle\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\NoResultException;
/**
* UserRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class UserRepository extends EntityRepository implements UserProviderInterface
{
private $qb = Null;
public function getOrCreateQB()
{
if(!$this->qb) {
$this->qb = $this->createQueryBuilder('u');
}
return $this->qb;
}
public function loadUserByUsername($username)
{
/* some logic */
/* define $q as the DQL query for column
that I interested in */
$user = $q->getSingleResult();
return $user;
}
[...]
そして、あなたはあなたが望むものを手に入れました。その「カスタム」クエリを使用するには、次の方法でそのリポジトリを使用するだけです。
$userRepo = $this->em->getRepository('SestanteUserBundle:User');
$this->userRepo->loadUserByUsername('userNameExample');
もちろん、ここでem
のインスタンスはentity manager