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

Sylius 1.11自定义多字段筛选问题:组合表达式失效

Sylius 1.11 自定义订单筛选器:组合isNull与in表达式失效的解决方法

在Sylius 1.11中构建关联字段的多选筛选器时,直接用orX()组合isNull('author')和in('author.id', [2])会失效,核心原因是SQL的三值逻辑:当author为null时,author.id的比较结果是UNKNOWN,而非FALSE,导致整个orX表达式的逻辑不符合预期。

解决思路

需要将in('author.id', [2])的条件与author不为null的条件绑定,确保只有当author存在时才判断其id是否符合要求,再与author为null的条件做或运算。

修改后的筛选器代码

<?php

declare(strict_types=1);

namespace App\Component\App\Grid\Filter;

use Sylius\Component\Grid\Data\DataSourceInterface;
use Sylius\Component\Grid\Filtering\FilterInterface;

final class MultiselectFilterAuthor implements FilterInterface
{
    public function apply(DataSourceInterface $dataSource, string $name, $data, array $options): void
    {
        if (empty($data)) {
            return;
        }

        $expressionBuilder = $dataSource->getExpressionBuilder();

        $expressions = [];
        // 筛选author字段为null的订单
        $expressions[] = $expressionBuilder->isNull('author');
        
        // 筛选author存在且id为2的订单
        $authorExists = $expressionBuilder->isNotNull('author');
        $authorIdMatch = $expressionBuilder->in('author.id', [2]);
        $expressions[] = $expressionBuilder->andX($authorExists, $authorIdMatch);

        $dataSource->restrict($expressionBuilder->orX(...$expressions));
    }
}

逻辑说明

  1. 第一个表达式直接筛选author为null的订单,这部分逻辑不受关联字段影响。
  2. 第二个表达式通过andX()组合两个条件:先确保author不为null,再判断其id是否在目标数组中,避免了null.id这种无效的SQL比较。
  3. 最终用orX()组合两个有效表达式,确保符合任一条件的订单都会被筛选出来。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:15:05