You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Shopware的Criteria对象获取原始SQL查询语句?

在Shopware中使用原始SQL及获取Criteria生成的SQL方法

一、直接执行原始SQL的方法

当Criteria无法满足复杂查询需求时,可通过以下两种方式执行自定义SQL:

1. 使用Doctrine Connection对象

从容器中注入Connection实例,直接执行原生SQL,适合嵌套查询、复杂多表关联场景,注意用参数绑定避免SQL注入:

use Doctrine\DBAL\Connection;

class YourCustomService
{
    public function __construct(private Connection $connection) {}

    public function fetchNestedQueryData()
    {
        $sql = 'SELECT p.id, p.name FROM product p 
                WHERE p.id IN (SELECT pc.product_id FROM product_category pc WHERE pc.category_id = :categoryId)';
        $params = ['categoryId' => 'your-category-uuid'];
        $result = $this->connection->fetchAllAssociative($sql, $params);
        
        return $result;
    }
}

2. 结合Repository与QueryBuilder

利用实体仓库的createQueryBuilder,在映射实体的基础上编写自定义SQL逻辑:

use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;

class YourProductService
{
    public function __construct(private EntityRepository $productRepository) {}

    public function fetchCustomFilteredProducts()
    {
        $qb = $this->productRepository->createQueryBuilder('p');
        $qb->where('p.id IN (SELECT pc.product_id FROM product_category pc WHERE pc.category_id = :categoryId)')
           ->setParameter('categoryId', 'your-category-uuid');
        
        return $qb->getQuery()->getResult();
    }
}

二、获取Criteria生成的原始SQL

Shopware没有提供直接获取Criteria对应SQL的公共API,但可通过以下两种方式实现:

1. 利用内部组件转换

借助Shopware内部的QueryParser和SqlQueryBuilder,将Criteria解析为SQL语句(注意:内部组件可能随版本变动,建议仅用于调试):

use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Parser\QueryParser;
use Shopware\Core\Framework\DataAbstractionLayer\Search\SqlQueryBuilder;
use Shopware\Core\Framework\DataAbstractionLayer\EntityDefinition;

class CriteriaSqlDebugger
{
    public function __construct(
        private QueryParser $queryParser,
        private SqlQueryBuilder $sqlQueryBuilder,
        private EntityDefinition $productDefinition
    ) {}

    public function getCriteriaGeneratedSql(Criteria $criteria)
    {
        $parsedQuery = $this->queryParser->parse($criteria, $this->productDefinition);
        $sqlStatement = $this->sqlQueryBuilder->build($parsedQuery, $this->productDefinition);
        
        return [
            'sql' => $sqlStatement->getSQL(),
            'parameters' => $sqlStatement->getParameters()
        ];
    }
}

2. 调试模式查看日志

开启Shopware调试模式与SQL日志,在日志中直接查看Criteria执行的SQL:

  1. 在.env文件中设置:
APP_ENV=dev
DATABASE_LOGGING=true
  1. 执行Criteria查询后,可在var/log/dev.log文件中找到对应的SQL语句及参数。

内容的提问来源于stack exchange,提问作者Ümit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 16:20:09