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 経由でこの種のクエリを実行することはできないのでしょうか?