Создайте несколько сложный запрос с объединениями подзапросов в предложении 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();
а затем сделать соединения
редактировать
кажется, я неправильно прочитал ваши вопросы, вот как вы это делаете:
<?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');
Так что в основном создайте еще один выбор, а затем передайте его объединению.