> プラグイン > プラグイン内で既存のテーブルをベースにしてプラグイン側のテーブルを結合するには? |
プラグイン
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
ikemoto |
投稿日時: 2015/11/13 11:40
対応状況: −−−
|
一人前 登録日: 2015/10/2 居住地: 投稿: 79 |
プラグイン内で既存のテーブルをベースにしてプラグイン側のテーブルを結合するには? お世話になっております。
前回、プラグインでつくったテーブルに既存のテーブルを結合する方法を質問し、 プラグインで商品にメーカー枠を追加するものを使用し、 メーカーIDが1の商品リストを取得する処理が出来ました。 既存テーブル ・dtb_product プラグインテーブル ・plugin_product_maker(商品のメーカー追加枠。dtb_productと1対1結合) maker_id,product_id等のフィールドをもつ ・plugin_maker(メーカーマスタ。plugin_product_makerと多対1結合) maker_id,name(メーカー名)等のフィールドをもつ …という構成を前提として、プラグイン側のymlにEccube\Entity\Productへの結合条件を指定し、 LclCustomと言うプラグイン内で実行するとして、 $qb = $app['orm.em']->createQueryBuilder(); $qb->select('pm,mk,p') ->from('Plugin\\LclCustom\\Entity\\ProductMaker', 'pm') ->leftJoin('pm.Maker','mk') ->innerjoin('pm.Product','p') ->where('mk.id=:maker_id') ->setParameter('maker_id',1) …と記述することでメーカーIDが1のリストが取れました。 -------------------------------------- そして、さらに商品の管理担当(1商品1担当者)を 管理しようと思っています。 追加するプラグインテーブル ・plugin_produc_staff(商品の管理者追加枠:dtb_productと1対1結合) ・plugin_staff(管理者マスタ plugin_product_staffと多対1結合) これで、メーカーIDが1、管理者IDが2の商品リストを取得するとなると、 プラグイン側テーブルをベース(from)にするのではなくて、 既存テーブル側の商品をベースにして↓のように書く必要がありますよね。 $qb = $app['orm.em']->createQueryBuilder(); $qb->select('pm,mk,p') ->from('\\Eccube\\Entity\\Product', 'p') ->innerjoin('p.ProductMaker','pm') ->leftjoin('pm.Maker','mk') ->innerjoin('p.ProductStaff','ps') ->leftjoin('ps.Staff','st') ->where('mk.id=:maker_id') ->andwhere('st.id=:staff_id') ->setParameter('maker_id',1) ->setParameter('staff_id',2) でも、こうする場合、商品マスタ(Product)のymlに 結合条件等を追加しておく必要がありますよね??、 src内にあるファイルに直接手を加えるのはちょっと抵抗が… src内のEntityやymlをプラグイン内で動的変更(拡張?)できればなんとかなる気もするのですが プラグイン側で既存のテーブル側に結合条件を動的付与したりする方法ってあるのでしょうか? -------------------------------------- 無理だったら前教えていただいた、結合を明示する形でいいかな…と思い $qb = $app['orm.em']->createQueryBuilder(); $qb->select('p') ->from('ECCUBE\\Entity\\Product', 'p') ->leftJoin('Plugin\\Maker\\Entity\\ProductMaker', 'pm', \Doctrine\ORM\Query\Expr\Join::WITH, 'p.id = pm.id') ->leftJoin('pm.Maker','mk') ->where('mk.id = 1'); で確認してみたのですが、 この場合、抽出条件でjoin使用して、fromのEntityだけ取りたい場合は◎ですが… select('p')だけだと目的通りのデータが取れるが、この結果が2レコードだとします。、 商品名以外にメーカー名も取ろうと思い $qb->select('p,pm,mk')と記述すると結果が4レコード(4行?)になります orz …どうも、 1行目⇒1レコード目のProductEntity 2行目⇒1レコード目のProductMakerEntity(配下にMakerEntityぶら下げた形) ------------------------------- 3行目⇒2レコード目のProductEntity 4行目⇒2レコード目のProductMakerEntity(配下にMakerEntityぶら下げた形) …となっていて、 \Doctrine\ORM\Query\Expr\Join::WITHで結合した場合、配下にぶら下がらずに縦積みになるような?? select('p.id,mk.id,mk.name') にすれば2レコードの連想配列で取れるのですが… -------------------------------------- 結果として、プラグイン内で 既存のテーブルをベースとしてそこにプラグイン側のテーブルを追加結合する場合、 生SQLか、\Doctrine\ORM\Query\Expr\Join::WITHで結合して列名明記で取るしかないでしょうか? オブジェクト(Entity)で取得できたらベストなのですが |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |