シムノート

PHPフレームワークSymfonyの学習帳

ユーザ用ツール

サイト用ツール


サイドバー

メニュー



このエントリーをはてなブックマークに追加

blog:2015-12-12:超入門_symfony3_doctrine_orm_後編

超入門 Symfony3 : (7) Doctrine ORM【後編】

【前篇】ではエンティティとレポジトリ、データベースを作成し、おみくじサイトの修正を行いました。 今回はおみくじサイトの仕様とは関係のない、ダミーのアクションメソッドを追加して、もう少しDoctrineの使い方を学びます。

検索

OmikujiControllerにアクションメソッドを追加して様々な検索を試してみましょう。

...

class OmikujiController extends Controller
{
    ...

    /**
     * @Route("/find")
     */
    public function findAction()
    {
        /**
         * エンティティの検索はリポジトリを通して行う ①
         * @var UnseiRepository $repository 
         */
        $repository = $this->getDoctrine()->getRepository(Unsei::class);

        // 全て検索 ②
        $unseis = $repository->findAll();
        dump($unseis);
        
        // ID(プライマリキー)で検索 ③
        $unsei = $repository->find(1);
        dump($unsei);

        // 複数の項目で1件だけ検索(ここでは'name'だけですが...)④
        $unsei = $repository->findOneBy([
            'name' => '大吉',
        ]);
        dump($unsei);
        
        // 複数の項目で複数件検索(ここでは'name'だけですが...)⑤
        // ※ 配列が返ってくる
        $unsei = $repository->findBy([
            'name' => '大吉',
        ]);
        dump($unsei);
        
        // プロパティに対応したダイナミックメソッドを使って1件だけ検索 ⑥
        $unsei = $repository->findOneById(1);
        dump($unsei);
        $unsei = $repository->findOneByName('中吉');
        dump($unsei);
        
        // ダイナミックメソッドを使って複数件検索 ⑦
        $unsei = $repository->findByName('中吉');
        dump($unsei);
        
        die; // プログラムを終了して、dumpを画面に表示 ⑧
        return new Response("Dummy");
    }
}

① Unseiエンティティの検索はUnseiRepositoryを通して行います。

findAll()で全てのエンティティを取得しています。 dump()を使うと⑥のdieをした時点で、画面にオブジェクトの内容を表示できます。 エンティティの配列が返ってくることが分かります。

find()にidを渡すことで1件のエンティティを取得しています。

findOneBy()項目名=>値の配列で条件を渡すことで、1件のエンティティを取得しています。

findBy()``項目名=>値の配列で条件を渡すことで、複数件のエンティティを取得しています。

findOneByプロパティ名()でプロパティの値で1件のエンティティを取得しています。

findByプロパティ名()でプロパティの値にマッチする複数のエンティティ(ここでは結果的に1件ですが)を取得しています。 エンティティの配列が返ってきます。

dieでプログラムを終了すると、それまでにdump()した内容が画面に表示されます。

http://localhost:8000/find にアクセスして動作確認をします。dump()の内容がブラウザに表示されます。

CRUD(Create, Read, Update, Delete)

CRUDを試すアクションメソッドを追加します。

...
use Doctrine\ORM\EntityManager;

class OmikujiController extends Controller
{
    ...

    /**
     * @Route("/crud")
     */
    public function crudAction()
    {
        /**
         * エンティティの作成、更新、削除はエンティティマネージャを通して行う ①
         *  @var EntityManager $em
         */
        $em = $this->getDoctrine()->getManager();

        //
        // Create
        //
        $unsei = new Unsei();    // ②
        $unsei->setName("大凶");
        dump($unsei);

        $em->persist($unsei);    // ③
        $em->flush();            // ④
        dump($unsei);

        //
        // Read ⑤
        //
        $repository = $em->getRepository(Unsei::class);
        
        /** @var Unsei $unsei */
        $unsei = $repository->findOneByName('大凶'); // ⑥
        dump($unsei);
        
        //
        // Update ⑦
        //
        $unsei->setName("大大吉");
        $em->flush();
        dump($unsei);
        
        $unsei = $repository->find($unsei->getId());
        dump($unsei);
        
        // 
        // Delete ⑧
        // 
        $em->remove($unsei);
        $em->flush();
        
        $unseis = $repository->findAll();
        dump($unseis);
        foreach ($unseis as $unsei) {
            dump($unsei->getName());
        }
        
        die; // プログラムを終了して、dumpを画面に表示

        return new Response("Dummy");
    }    
}

① エンティティマネージャを取得しています。エンティティの作成、更新、削除はエンティティマネージャを通して行います。

②③④はCreateの例です。
② 普通にPOPO(Plain Old PHP Object)としてインスタンスを作成し、プロパティをセットします。
persist()メソッドを使って、エンティティマネージャに②で新規作成したインスタンスを保存対象として管理するよう伝えています。この時点ではまだ、SQLは発行されておらず、DBに保存されていません。
flush()メソッドを実行するとエンティティーマネージャの管理にあるオブジェクトで変更のあるものをDBに反映します。ここではunseiテーブルに対してINSERT SQL文が実行されます。

⑤ UnseiRepositoryを取得しています。ここではエンティティマネージャからレポジトリを取得しています。
⑥ Unseiエンティティを1件取得しています。

⑦ Updateの例です。Unseiオブジェクトの名前を変更した後、flush()を実行してDBに反映しています。ここではUPDATE SQL文が実行されます。persist()を使っていないことに注目してください。ここではUnseiオブジェクトはレポジトリ(Doctrine)から取得しているので、すでにエンティティマネージャの管理下にあります。

⑧ Deleteの例です。remove()でエンティティマネージャに削除対象のオブジェクトを伝えた後にflush()を実行してDBに反映しています。ここではDELTE SQL文が実行されます。

http://localhost:8000/crud にアクセスしてdumpの内容を確認してみましょう。

DQL

DoctrineではDQL(Doctrine Query Language)を使ってもっと複雑な問い合わせをすることも可能です。

...
class OmikujiController extends Controller
{
    ...
    
    /**
     * @Route("/dql")
     */
    public function dql()
    {
        /** @var EntityManager $em */
        $em = $this->getDoctrine()->getManager();
        $query = $em->createQuery(
            'SELECT u
            FROM AppBundle:Unsei u
            WHERE u.name = :name'        // ①
        )->setParameter('name', '大吉');
        
        $unsei = $query->getResult();
        dump($unsei);
        
        die; // プログラムを終了して、dumpを画面に表示

        return new Response("Dummy");
    }
}

① DQLは非常にSQLと似ています。SQLだとテーブル名を指定する所でエンティティクラスを指定しています。'AppBundle:Unsei'という記述は'AppBundle\Entity\Unsei'のショートカット書式です。

http://localhost:8000/dql にアクセスしてdumpの内容を確認してみましょう。

Query Builder

DQL文字列を書く替わりに、QueryBuilderを使ってクエリーを作成する事もできます。QueryBuilderは動的なDQLを生成する時に、便利です。文字列を連結してクエリーを作成するより、綺麗なコードでクエリーを作成できます。

...
class OmikujiController extends Controller
{
    ...
    
    /**
     * @Route("/qb")
     */
    public function queryBuilder()
    {
        /** @var UnseiRepository $repository **/
        $repository = $this->getDoctrine()->getRepository(Unsei::class);
        
        $query = $repository->createQueryBuilder('u')
            ->where('u.name = :name')
            ->setParameter('name', '大吉')
            ->getQuery();

        $unsei = $query->getResult();
        dump($unsei);
        
        die; // プログラムを終了して、dumpを画面に表示

        return new Response("Dummy");
    }
}

http://localhost:8000/qb にアクセスしてdumpの内容を確認してみましょう。


Comments



30 -8 = ?
blog/2015-12-12/超入門_symfony3_doctrine_orm_後編.txt · 最終更新: 2015/12/18 20:47 by tsubo