バージョン選択

フォーラム

メニュー

オンライン状況

57 人のユーザが現在オンラインです。 (50 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 57
もっと...

サイト内検索

 > プラグイン > プラグイン内で既存のテーブルをベースにしてプラグイン側のテーブルを結合するには?

プラグイン

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
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)で取得できたらベストなのですが
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は89,012名です
総投稿数は110,020件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1296
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.