TYPO3仓库查询问题:多ID字符串传入$query->in()失效
解决TYPO3中多ID逗号分隔字符串的查询问题
这个问题我之前碰到过,核心原因是TYPO3的查询in()方法需要的是数组类型的参数,而不是逗号分隔的字符串~
问题根源
当你传入单个ID字符串(比如'261')时,TYPO3底层会自动把它兼容转换成单元素数组,所以查询能正常工作;但如果是逗号分隔的多ID字符串(比如'261,284,291'),in()方法会把整个字符串当作单个值去匹配contentType字段,自然查不到任何结果。
解决方案
我们需要先把逗号分隔的字符串拆分成合法的ID数组,再传入in()方法里,同时还要做一些参数清理,避免无效值影响查询:
$query = $this->createQuery(); $constraint = $query->in('category', $categories); if (!empty($contentType)) { // 把逗号分隔的字符串拆分成数组,同时清理无效ID $contentTypeArray = array_filter(array_map(function($item) { $cleanId = trim($item); // 确保ID是数字类型,过滤非数字的无效值 return is_numeric($cleanId) ? (int)$cleanId : null; }, explode(',', $contentType))); // 只有当数组不为空时,才添加contentType的约束 if (!empty($contentTypeArray)) { $constraint = $query->logicalAnd( $constraint, $query->in('contentType', $contentTypeArray) ); } } $results = $query->matching($constraint) ->setLimit((int)$limit) ->setOffset((int)$offset) ->execute() ->toArray();
代码说明
- 拆分字符串:用
explode(',', $contentType)把逗号分隔的字符串拆成数组 - 清理参数:
trim($item)去掉每个ID前后的空格(避免用户输入时带空格的情况)is_numeric()判断是否为有效数字,转换成整数后保留,否则设为nullarray_filter()自动移除数组里的null值和空字符串,避免无效ID传入查询
- 空数组判断:额外加了
if (!empty($contentTypeArray)),防止拆分后数组为空导致查询出错
内容的提问来源于stack exchange,提问作者Patrick Piroth
相关产品推荐
相关产品推荐

