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

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では取得できないっぽいので要注意です。

Follow me!