如何通过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:
- 在
.env文件中设置:
APP_ENV=dev DATABASE_LOGGING=true
- 执行Criteria查询后,可在
var/log/dev.log文件中找到对应的SQL语句及参数。
内容的提问来源于stack exchange,提问作者Ümit
相关产品推荐
相关产品推荐

