symfony7之使用LPAD做like拼接查询
解释:
LPAD 是 SQL 中的一个字符串函数,全称是 Left PAD,意思是:向字符串左边填充指定字符,直到达到指定长度。
语法:
LPAD(string, length, pad_string)
string:要被填充的原字符串(可以是字段)
length:目标长度
pad_string:用来填充的字符(通常是 '0')
使用:
在 Symfony 7 + Doctrine 下使用 `LPAD`(`Lpad` 函数)确实需要通过引入 `beberlei/DoctrineExtensions` 中的自定义 DQL 函数 `DoctrineExtensions\Query\Mysql\Lpad`。以下是完整的引入、配置和在 `QueryBuilder` 中正确使用的方式。
✅ 1. 安装依赖
首先,确保安装了 beberlei/DoctrineExtensions:
composer require beberlei/DoctrineExtensions
✅ 2. 注册 Lpad 函数到 Doctrine
在 config/packages/doctrine.yaml 中添加配置:
doctrine:
orm:
dql:
string_functions:
LPAD: DoctrineExtensions\Query\Mysql\Lpad
注意:
LPAD是大小写敏感的,注册名(左侧)需要与 SQL 使用时一致。
✅ 3. 正确使用 LPAD + CONCAT + LIKE 组合
在 QueryBuilder 中不能直接使用 PHP 函数,需要用 DQL 表达式来写。你提供的语法:
$qb->expr()->like("CONCAT(e.abbreviation, '-', LPAD(s.indexNumber, 6, 0))", ':searchString')
是字符串,不能直接传给 expr()->like()。正确写法是使用 Expr 的 literal() 或手动拼接 DQL:
$qb->andWhere(
$qb->expr()->like(
"CONCAT(e.abbreviation, '-', LPAD(s.indexNumber, 6, '0'))",
':searchString'
)
);
$qb->setParameter('searchString', '%' . $searchString . '%');
⚠️ 注意几点:
- LPAD 第三个参数是字符,必须用
'0'包括引号。 LPAD(s.indexNumber, 6, '0')是 DQL 中自定义函数。- 整个表达式作为字符串传给
like(),等价于原生 SQL。
🧪 示例完整代码片段
$qb = $em->createQueryBuilder();
$qb->select('s')
->from(Submission::class, 's')
->join('s.event', 'e')
->andWhere(
$qb->expr()->like(
"CONCAT(e.abbreviation, '-', LPAD(s.indexNumber, 6, '0'))",
':searchString'
)
)
->setParameter('searchString', '%' . $searchTerm . '%');
如果遇到 Function 'LPAD' does not exist,说明注册没有成功,确认:
doctrine.yaml中的配置是否在正确环境下(比如dev,prod)。- 配置是否清除缓存后重新加载了:运行
php bin/console cache:clear
