【问题标题】:How to use DBAL query builder to build this subquery?如何使用 DBAL 查询生成器来构建这个子查询?
【发布时间】:2023-03-04 11:43:03
【问题描述】:

我有这个带有子查询的查询。

SELECT * FROM 
(SELECT module_id FROM an_modules AS m LIMIT 20 OFFSET 0) AS m 
LEFT JOIN an_module_sites AS ms ON (m.module_id = ms.module_id)

如何使用DBAL 来构建这样的子查询?
这似乎不起作用。

$qb->select('*')
    ->from(
        $qb->select('module_id')
            ->from($this->Db->getTableName('modules'), 'm')
        , 'm')
    ->leftJoin('m', $this->Db->getTableName('module_sites'), 'ms', 'm.module_id = ms.module_id');
$stmt = $qb->execute();
$result = $stmt->fetchAll();

【问题讨论】:

  • 查询生成器不支持查询中的 from 语句。我建议您直接通过连接$conn->executeQuery(.. 执行,或者如果您需要与statement 作为$stmt = $conn->prepare($sql); 的参数进行交互,那么您可以绑定值等...

标签: mysql doctrine-orm dbal


【解决方案1】:

我最近需要这样做来实现分页/排序助手。作为其中的一部分,我将采用由我的模型执行的查询构建器,并一般计算不受限制时它将产生的总行数。

要成为跨平台,我不能使用 rowCount 并且潜在的分组意味着我不能只更改选择中的字段 - 所以最好的选择是删除限制并将其计为子查询。这是我想出的:

<?php
$totalResults = $qb->getConnection()->createQueryBuilder()
    ->select('COUNT(*)')
    ->from(
        '('
        .$qb
            ->setFirstResult(null)
            ->setMaxResults(null)
            ->resetQueryPart('orderBy')
            ->getSQL()
        .')',
        'tmp')
    ->execute()
    ->fetch(\PDO::FETCH_COLUMN);

我不确定 ORM 教义如何处理这个问题,但至少在纯 DBAL 中这似乎有效。

【讨论】:

    猜你喜欢
    • 2018-07-03
    • 2017-01-17
    • 2021-06-05
    • 1970-01-01
    • 2022-11-14
    • 2021-02-20
    • 2020-11-24
    • 2021-11-16
    • 2015-07-10
    相关资源
    最近更新 更多