数组作为Doctrine SQLFilter

时间:2016-10-14 03:07:17

标签: symfony doctrine-orm doctrine

我正在尝试创建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;在俄罗斯。因此,我想避免使用它们并编写更优雅的代码)

1 个答案:

答案 0 :(得分:0)

将其设为 IN 而非比较。

foreach ($fdata as $param) {
    $filter .= sprintf('OR %s.deleted IN (%s)', $targetTableAlias, param);
}