我正在重构一个Zend Framework2应用程序,以使用doctrine 2.5 DBAL而不是Zend_DB(ZF1)。
$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')
我不知道如何使用doctrine 2.5查询生成器连接子查询。在主查询中,我需要从子查询中选择列。
我在这里读到doctrine不支持连接子查询。如果仍然是这样,我可以使用doctrine DBAL的SQL查询生成器以另一种方式编写这个查询吗?原生SQL对我来说可能不是一个好的解决方案,因为这个查询将在后面的代码中动态扩展。
2条答案
按热度按时间3xiyfsfu1#
我已经找到了一个解决方案,将DQL example应用到DBAL中。诀窍是获取子查询的原始SQL,将其 Package 在括号中,然后连接它。子查询中使用的参数必须在主查询中设置:
重要这是 * 连接 * 的
createQueryBuilder
,而不是实体管理器的createQueryBuilder
。31moq8wy2#
要回答您问题的这一部分:
我不知道如何使用doctrine 2.5查询生成器连接子查询
您可以创建2个查询生成器示例,并在第一个查询的子句中使用第二个示例中的DQL。示例:
查看示例here或here或使用Google查找更多信息