我正在尝试创建Doctrine SQLFilter。我需要过滤"删除"领域。但我想让过滤器同时使用(true和false)值。
这样的事情:
<?php
namespace Rem\CostsBundle\Doctrine;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Query\Filter\SQLFilter;
class ItemDeletedFilter extends SQLFilter
{
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
if ($targetEntity->getReflectionClass()->name != 'Rem\CostsBundle\Entity\Item') {
return '';
}
$fdata = $this->getParameter('deleted');
$filter = '1<>1';
foreach ($fdata as $param) {
$filter .= sprintf('OR %s.deleted = %s', $targetTableAlias, $param);
}
return $filter;
}
}
但是当我试图在控制器
中设置可靠的过滤器值数组时$filters
->enable('costs_item_deleted')
->setParameter('deleted', [true, false]);
我收到错误500
Warning: PDO::quote() expects parameter 1 to be string, array given
这是明显的情况。但是,毕竟如何向我的SQL过滤器发送一系列参数?
德米特里回答后的UPD :这不是我想要的。让我们说:如果我想用几个字段值过滤怎么办?例如,对于2015年和2016年的记录......所以我需要在 - &gt; setParameter中设置某种数组。但它只想要字符串!当我试图设置其他内容时发送错误。 你是怎么解决的?
甚至更复杂的例子。如果我需要按关系字段过滤该怎么办?在这种情况下,我需要将实体设置为过滤器的参数。甚至是ArrayCollection实体!
现在我决定这样:我将json_encode数组设置为控制器中的setParameter。然后我在Filter类中对它进行json_decode。但!在Filter类我需要再做一步。我需要从json字符串中删除single和doublequotes。因为它们是由setParameter添加到转义字符串(这就是为什么我们喜欢它))。)。
这样的代码黑客我们称之为&#34;拐杖&#34;在俄罗斯。因此,我想避免使用它们并编写更优雅的代码)
答案 0 :(得分:0)
将其设为 IN 而非比较。
foreach ($fdata as $param) {
$filter .= sprintf('OR %s.deleted IN (%s)', $targetTableAlias, param);
}