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

Shopware6中如何为Criteria添加原生SQL过滤条件?

在Shopware6中使用Criteria执行原生SQL过滤的方案

Shopware6的Criteria确实不支持直接把SQL函数作为字段名传入RangeFilter,但可以通过以下两种方式实现你的需求:

方法一:使用ExpressionFilter结合NativeSqlExpression

这是官方推荐的方式,既能嵌入原生SQL片段,又能保留ORM实体映射:

use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\ExpressionFilter;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\FilterOperator;
use Shopware\Core\Framework\DataAbstractionLayer\Dbal\Sql\NativeSqlExpression;

// 构建Criteria实例
$criteria = new Criteria();

// 添加原生SQL过滤条件
$criteria->addFilter(new ExpressionFilter(
    FilterOperator::LTE,
    new NativeSqlExpression('DATEDIFF(NOW(), createdAt)'),
    1
));

// 用Repository执行查询,结果会自动映射为规范的ORM实体
$entities = $this->yourRepository->search($criteria, $context)->getEntities();

NativeSqlExpression会直接将传入的SQL片段原样注入查询,ExpressionFilter负责关联表达式与比较值,完美解决原生SQL需求与实体映射的平衡。

方法二:自定义DbalQueryExtension(复杂场景适配)

如果需要更灵活的原生SQL操作,可以通过自定义DbalQueryExtension修改底层QueryBuilder:

  1. 编写自定义Extension类:
use Shopware\Core\Framework\DataAbstractionLayer\Dbal\QueryBuilder;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Dbal\QueryExtensionInterface;

class DateRangeQueryExtension implements QueryExtensionInterface
{
    public function extend(QueryBuilder $queryBuilder, Criteria $criteria): void
    {
        // 通过Criteria的自定义开关控制过滤逻辑
        if ($criteria->getExtension('filter_recent_entries')) {
            $queryBuilder->andWhere('DATEDIFF(NOW(), createdAt) <= 1');
        }
    }
}
  1. 注册服务(在services.yaml中配置):
services:
  App\Core\Framework\DataAbstractionLayer\DateRangeQueryExtension:
    tags:
      - name: shopware.data_abstraction_layer.query_extension
  1. 使用时启用过滤:
$criteria = new Criteria();
$criteria->addExtension('filter_recent_entries', true);

$entities = $this->yourRepository->search($criteria, $context)->getEntities();

为什么原始写法报错?

Shopware6的Criteria会严格校验传入的字段是否属于对应实体的定义,直接把SQL函数当成字段名传入,自然会触发“字段不存在”的错误。上面两种方法都是在底层SQL构建阶段注入原生逻辑,同时保留Criteria的ORM映射能力,避免了直接操作QueryBuilder导致的数据不规范问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:25:17