首页  >  文章  >  数据库  >  如何在 Doctrine DBAL 中加入子查询?

如何在 Doctrine DBAL 中加入子查询?

Linda Hamilton
Linda Hamilton原创
2024-10-24 03:52:31297浏览

How to Join Subqueries in Doctrine DBAL?

将子查询与 Doctrine DBAL 结合

在重构 Zend Framework 应用程序以使用 Doctrine 2.5 DBAL 的过程中,翻译可能具有挑战性以前的 Zend_DB 格式的复杂查询。其中一个挑战在于连接子查询,这之前是使用 joinLeft() 等方法完成的。

尽管 Doctrine DBAL 本身不支持连接子查询,但有一种解决方法可以利用子查询的原始 SQL。通过将子查询 SQL 括在括号中并使用 sprintf() 函数,可以将其作为常规表连接。

示例

考虑以下 Zend_Db 查询:

// Subquery to find the minimum timestamp for each user survey.
$subSelect = $db->select()
   ->from('user_survey_status_entries', array('userSurveyID', 'timestamp' => 'MIN(timestamp)'))
   ->where('status = ?', UserSurveyStatus::ACCESSED)
   ->group('userSurveyID');

// Main query to join user surveys and subquery results.
$select = $db->select()
   ->from(array('us' => 'user_surveys'), $selectColNames)
   ->joinLeft(array('firstAccess' => $subSelect), 'us.userSurveyID = firstAccess.userSurveyID', array())
   ->where('us.surveyID = ?', $surveyID);

Doctrine DBAL 翻译

在 Doctrine DBAL 中,获取子查询的原始 SQL 如下:

$subSelect = $connection->createQueryBuilder()
   ->select(array('userSurveyID', 'MIN(timestamp) timestamp'))
   ->from('user_survey_status_entries')
   ->where('status = :status')
   ->groupBy('userSurveyID');

$subSelectSQL = $subSelect->getSQL();

子查询 SQL然后用括号括起来并加入到主查询中:

$select = $connection->createQueryBuilder()
   ->select($selectColNames)
   ->from('user_surveys', 'us')
   ->leftJoin('us', sprintf('(%s)', $subSelectSQL), 'firstAccess', 'us.userSurveyID = firstAccess.userSurveyID')
   ->setParameter('status', UserSurveyStatus::ACCESSED)
   ->where('us.surveyID = :surveyID')
   ->setParameter('surveyID', $surveyID);

这种方法允许在 Doctrine DBAL 中加入子查询,同时保持稍后在代码中动态扩展查询的能力。

以上是如何在 Doctrine DBAL 中加入子查询?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn