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

ブックマークや限定記事(予定)など
WP Kyotoサポーター募集中
WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。
14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。