DoctrineのcreateQueryでDBをJOINした時の覚書

Doctrineで2つのテーブルをJOINさせて取得する処理を実装させたので、その時のメモを覚書としてまとめました。 1:1つ目のテーブルを呼び出す 何はともあれまずは1つ目のテーブルを呼び出します。 [php] $qu […]

広告ここから
広告ここまで

目次

    Doctrineで2つのテーブルをJOINさせて取得する処理を実装させたので、その時のメモを覚書としてまとめました。

    1:1つ目のテーブルを呼び出す

    何はともあれまずは1つ目のテーブルを呼び出します。
    [php]
    $query = $this->backend->getEM()->createQuery(‘SELECT variation FROM Entities\Item\Variation variation WHERE variation.owner_no = :owner_no’);
    $query->setParameter(‘owner_no’, $owner_no());
    $result = $query->getResult();
    [/php]

    2:2つめのテーブルをJOINする

    通常MySQLでJOINするときは、下の様にJOINするカラムを定義します。

    [sql]
    SELECT * FROM items t0
    LEFT JOIN item_variation t1 ON t1.item_no = t0.item_no
    [/sql]

    これがDoctrineのcreateQueryを使うとこうなります。

    [php]
    $query = $this->backend->getEM()->createQuery(‘SELECT variation, items FROM Entities\Item\Variation variation JOIN variation.items items WHERE variation.owner_no = :owner_no’);
    $query->setParameter(‘owner_no’, $owner_no());
    $result = $query->getResult();
    [/php]

    結合先の指定などがされておらず「JOIN variation.items item」だけで片付けられています。

    これは事前にymlで以下の様な形で結合方法について指定されているからです。

    [sql]
    manyToOne:
    items:
    targetEntity: \Entities\Item\Item
    inversedBy: variation
    joinColumn:
    name: item_no
    referencedColumnName: item_no
    [/sql]

    3:JOINしたデータで絞り込む

    JOINしたテーブルのデータも通常通り「item.deleted_at」の様な形で指定をすることができます。
    [php]
    $query = $this->backend->getEM()->createQuery(‘SELECT variation, items FROM Entities\Item\Variation variation JOIN variation.items items WHERE variation.owner_no = :owner_no AND item.is_deleted is null’);
    $query->setParameter(‘owner_no’, $owner_no());
    $result = $query->getResult();
    [/php]

    SQL文でjoinさせる必要がないので便利ですが、反面ymlで指定されていないものはcreateQueryでは取得できないっぽいので要注意です。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark