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)); } }
逻辑说明
- 第一个表达式直接筛选
author为null的订单,这部分逻辑不受关联字段影响。 - 第二个表达式通过
andX()组合两个条件:先确保author不为null,再判断其id是否在目标数组中,避免了null.id这种无效的SQL比较。 - 最终用
orX()组合两个有效表达式,确保符合任一条件的订单都会被筛选出来。
内容的提问来源于stack exchange,提问作者Louis Bertin
相关产品推荐
相关产品推荐

