0

通常、生のPHPでMySQLを使用する場合、取得したデータセットで使用するフィールドのみを選択します。大量の環境では、データ転送を可能な限り減らすことが理にかなっています。

Doctrineで関連オブジェクトを定義できるので、エンティティ定義に1行か2行追加することで、突然にアクセスできるのはすばらしいことですEmployee->Company->Fax。(私はこれをチェックしていませんが)舞台裏でそれがしているようSELECT *です。これが本当なら、私が必要だと思うフィールドだけを引っ張る方法はありますか?それとも、堅実なキャッシュスキームの問題でさえあると思いますか?

4

1 に答える 1

2

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

于 2012-07-27T07:13:30.823 に答える