我正在重构Zend_DB 2 2应用程序,以使用理论2.5DBAL而不是Zend_DB (ZF1)。我有以下Zend_Db查询:
$subSelect = $db->select()
->from('user_survey_status_entries', array('userSurveyID', 'timestamp' => 'MIN(timestamp)'))
->where('status = ?', UserSurveyStatus::ACCESSED)
->group('userSurveyID');
$select = $db->select()
// $selectColNames contains columns both from the main query and
// the subquery (e.g. firstAccess.timestamp AS dateFirstAccess).
->from(array('us' => 'user_surveys'), $selectColNames)
->joinLeft(array('firstAccess' => $subSelect), 'us.userSurveyID = firstAccess.userSurveyID', array())
->where('us.surveyID = ?', $surveyID);这将导致以下MySQL查询:
SELECT `us`.`userSurveyID`,
// More columns from main query `us`
`firstAccess`.`timestamp` AS `dateFirstAccess`
FROM `user_surveys` AS `us`
LEFT JOIN (
SELECT `user_survey_status_entries`.`userSurveyID`,
MIN(timestamp) AS `timestamp`
FROM `user_survey_status_entries`
WHERE (status = 20)
GROUP BY `userSurveyID`
) AS `firstAccess` ON us.userSurveyID = firstAccess.userSurveyID
WHERE (us.surveyID = '10')我不知道如何使用Doction2.5查询生成器加入子查询。在主查询中,我需要从子查询中选择列。
我读过这里关于不支持加入子查询的理论。如果仍然是这样的话,我是否可以使用理论DBAL的SQL查询生成器以另一种方式编写这个查询呢?对于我来说,原生SQL可能不是一个好的解决方案,因为这个查询将在后面的代码中进行动态扩展。
发布于 2016-02-26 16:29:26
通过将这个DQL实例应用于DBAL,我找到了一个解决方案。诀窍是获取子查询的原始SQL,将其封装在括号中,并加入它。必须在主查询中设置子查询中使用的参数:
重要--它是连接的createQueryBuilder,而不是实体管理器。
$subSelect = $connection->createQueryBuilder()
->select(array('userSurveyID', 'MIN(timestamp) timestamp'))
->from('user_survey_status_entries')
// Instead of setting the parameter in the main query below, it could be quoted here:
// ->where('status = ' . $connection->quote(UserSurveyStatus::ACCESSED))
->where('status = :status')
->groupBy('userSurveyID');
$select = $connection->createQueryBuilder()
->select($selectColNames)
->from('user_surveys', 'us')
// Get raw subquery SQL and wrap in brackets.
->leftJoin('us', sprintf('(%s)', $subSelect->getSQL()), 'firstAccess', 'us.userSurveyID = firstAccess.userSurveyID')
// Parameter used in subquery must be set in main query.
->setParameter('status', UserSurveyStatus::ACCESSED)
->where('us.surveyID = :surveyID')->setParameter('surveyID', $surveyID);发布于 2016-01-13 15:45:11
要回答你问题的这一部分:
我想不出如何使用理论2.5查询生成器来连接子查询
您可以创建2个查询生成器实例,并在第一个查询的子句中使用第二个实例中的DQL。举个例子:
->where($qb->expr()->notIn('u.id', $qb2->getDQL())检查示例这里、这里或使用Google查找更多信息
https://stackoverflow.com/questions/34768821
复制相似问题