Создайте несколько сложный запрос с объединениями подзапросов в предложении FROM, используя Zend Framework 2 tableGateway

Я пытаюсь сгенерировать следующий запрос, используя 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. Может быть, это не возможно сделать такой запрос через tableGateway?

1 ответ

По ссылке ниже, вам нужно передать третий параметр:

$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');

Так что в основном создайте еще один выбор, а затем передайте его объединению.

Другие вопросы по тегам