1

Zend Framework 2 tableGateway を使用して次のクエリを生成しようとしています。

SELECT 
dfsstamp, 
dfcstamp, 
df_rstrd_flg, 
dfctid, 
dfname, 
dfloc, 
dfdesc, 
dfcuser, 
dfmuser, 
dfid AS, 
t2.dfdfid, 
ctname, 
cafldnme, 
caid, 
atid, 
atvalue, 
t1.record_count
FROM 
(
    select * from dssdocflp 
    where dfdfid <= 1
) as t2
LEFT JOIN
(
    select dfdfid, count(*) as record_count from dssdocflp
    group by dfdfid having dfdfid > 1
) as t1
on t2.dfid = t1.dfdfid
INNER JOIN dsscfgtpp ON ctid = dfctid 
INNER JOIN dsscfgatp ON cactid = ctid 
INNER JOIN dssattrp ON atcaid = caid AND atdfid = dfid 
WHERE dfdbid = '33' 
ORDER BY dfcstamp DESC, dfid ASC, caseqno ASC

以下は私がこれまでに得たものです

$select = $this->tableGateway
                   ->getSql()
                   ->select()
                   ->columns(array(
                        'dfsstamp' => new Expression('date(dfsstamp)'),
                        'dfcstamp' => new Expression('date(dfcstamp)'),
                        'df_rstrd_flg',
                        'dfctid',
                        'dfname',
                        'dfloc',
                        'dfdesc',
                        'dfcuser',
                        'dfmuser',
                        'dfid',
                        'dfdfid'
                        //'record_count'
                        ))
                    ->join('dsscfgtpp', 'ctid = dfctid', array('ctname'))
                    ->join('dsscfgatp', 'cactid = ctid', array('cafldnme', 'caid'))
                    ->join('dssattrp', 'atcaid = caid AND atdfid = dfid', array('atid', 'atvalue'))
                    ->where(dfdbid = 33)
                    ->order(array('dfcstamp DESC', 'dfid ASC', 'caseqno'))

サブクエリとの左結合を機能させるだけです。from メソッドと join メソッドのどの組み合わせを組み合わせる必要があるのか​​ わかりません。私は今3時間苦労していますが、助けを求めています. どんな助けでも大歓迎です

@peterpeterson からの提案に基づいて、これは私が試した新しいクエリです

 $subselect_t2 = new Select();
    $subselect_t2->from('dssdocflp')
        ->where(array('dfdid <= 1'));

    $subselect_t1 = new Select();
    $subselect_t1->from('dssdocflp')
        ->columns(array(
            'dfdfid',
            'record_count' => new Expression('count(*)')
        ))
        ->group(array('dfdfid'))->having(array('dfdid > 1'));

    $select = $this->tableGateway
                   ->getSql()
                   ->select()
                   ->columns(array(
                        'dfcstamp',
                        'df_rstrd_flg',
                        'dfctid',
                        'dfname',
                        'dfloc',
                        'dfdesc',
                        'dfcuser',
                        'dfmuser',
                        'dfid',
                        'dfdfid',
                        't1.record_count'
                        ))
                    ->from(array('t2' => $subselect_t2))
                    ->join(array('t1' => $subselect_t1), 't2.dfid = t1.dfdid', array(), 'left')
                    ->join('dsscfgtpp', 'ctid = dfctid', array('ctname'))
                    ->join('dsscfgatp', 'cactid = ctid', array('cafldnme', 'caid'))
                    ->join('dssattrp', 'atcaid = caid AND atdfid = dfid', array('atid', 'atvalue'))
                    ->where($this->documentWhereClause->create($searchData))
                    ->order(array('dfcstamp DESC', 'dfid ASC', 'dfdfid DESC', 'caseqno'))
                    ->limit(500);

実行して実行すると、次のエラーが表示されます。

このオブジェクトは、コンストラクターでテーブルやスキーマを使用して作成されたため、読み取り専用です。

たぶん、私はまだクエリを正しく形成していません。テーブルゲートウェイを使用しています。tableGateway 経由でこの種のクエリを実行することはできないのでしょうか?

4

1 に答える 1

0

以下のリンクに従って、3 番目のパラメーターを渡す必要があります。

$select::JOIN_LEFT

よくわかりませんが、変数を保存する必要があるかもしれません:

$select = $this->tableGateway
                   ->getSql()
                   ->select();

そして、結合を行います

SQL Join zf2

編集

私はあなたの質問を読み間違えたようです。これがあなたのやり方です:

<?php
$subselect = new Select;
$subselect->from('bar')->where->like('y', '%Foo%');
$select = new Select;
$select->from('foo')->join(array('z' => $select39subselect), 'z.foo = bar.id');

したがって、基本的に別の選択を作成し、それを結合に渡します。

于 2015-09-23T16:04:07.970 に答える