SatelliteSeven

理解して説明できるようになってから、ソースを書きたいエンジニアのブログ

【Symfony】【Doctrine】getRepository() の使い方

単純なのですが、調べていくと混乱してしまったメソッドです。
すでに Symfony を使っている人には

「いや、簡単だろ」

っていう人が多いと思います。
けど、理解が遅い私には結構なメソッドなんです…orz

getRepository() は Symfony と Doctrine を使う上で必ず使うメソッドです。
使わないことはないと思います。

ですのでまだ Symfony に触れたばっかりや、始めようと思っている方向けに
書いていきます(自分も初心者というのもあるのですがw)。

【概要】
  • リポジトリ(訳:貯蔵庫)とは Entity のフェッチ(検索)を補助するためのクラス
  • 指定されたエンティティを取得するためのリポジトオブジェクトを返す。
  • デフォルトでは Doctrine\ORM\EntityRepository クラスを使用する。
  • データベースに対する操作は「リポジトリ」に実装しており、エンティティクラス毎に対応するリポジトリを用意できる。
  • 検索の際に、ロジックが必要な場合は BundleName\Repository\ 配下に Doctrine\ORM\EntityRepository を継承したリポジトリクラスを用意する。
  • リポジトリクラスを用意していなくても、find()、findAll、などのメソッドが使える( EntityRepositoy で使えるメソッド )


以上が本当に簡単な概要です。
一応わかりやすく書いたつもりですが、分かりにくい!などありましたらコメントください^^;

では次に使い方です。

【使い方】

■ Controller 側 ( Controller/TestController.php )

<?php

namespace My\BundleName\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use My\BundleName\Entity\Test;

/**
 * アノテーションについてはまた今度
 */
class TestController extends Controller
{
    
    /**
     * こちらも^^;
     */
    public function indexAction($id, $search)
    {
        $search = $this->getRequest()->request->get('search');
        // エンティティマネージャーについてもまた今度^^;
        $em = $this->getDoctrine()->getManager();

        // find系に関しては配列で引数を指定できるのですが、こちらはまた別の日にw

        // find() :プライマリキーを指定し、一致する レコードをオブジェクトで返す
        $entity = $em->getRepository('MyBundleName:Test')->find($id);

        // findBy◯◯() : Entity の $name を指定し、一致する レコードをオブジェクトで返す(複数件)
        $entity = $em->getRepository('MyBundleName:Test')->findByName($id);

        // findOneBy◯◯() : Entity の $name を指定し、一致する レコードをオブジェクトで返す(1件)
        $entity = $em->getRepository('MyBundleName:Test')->findOneBy($id);

        // findOneBy◯◯() : Entity の $name を指定し、一致する レコードをオブジェクトで返す(1件)
        $entity = $em->getRepository('MyBundleName:Test')->findOneBy($id);

        // TestRepository クラスのメソッドに対して検索語句を引数にして実行しオブジェクトを返す(後述)
        $query = $em->getRepository('MyBundleName:Test')->findSearch($search);
    }
}
?>

■ Entity 側 ( Entity/Test.php )

<?php

namespace My\BundleName\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Test
 *
 * @ORM\Table(name="test")
 * //Repository クラスを使う場合には Entity で指定する
 * @ORM\Entity(repositoryClass="My\BundleName\Repository\TestRepository")
 */
class Test
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=64, nullable=false)
     */
    private $name;
}
?>

■ Repository 側 ( TestRepository.php )

<?php

namespace My\BundleName\Repository;

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join;
use My\BundleName\Entity\Test;

/**
 * TestRepository
 *
 * @author Satellite Seven
 */
class TestRepository extends EntityRepository
{
    public function findSearch()
    {
        $queryBuilder = createQueryBuilder('t') 
        ~ ロジックは省略 ~

        return $queryBuilder->getQuery();
    }
} 

?>

以上。
ペンディングにしているところが多いですが、必ず補完しますので^^;

ご不明な点がありましたらコメントください>

間違ってたらご指摘ください〜m(__)m