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