学说过滤器:仅过滤直接水合实体,而不过滤关系实体

时间:2016-07-27 21:49:51

标签: php symfony doctrine-orm doctrine-orm-filters

如何(在Doctrine过滤器内)确定实体是直接水合还是仅加入或从其他实体关系获取?

我知道如何全局过滤,这有效(在Symfony' kernel.request监听器中启用了过滤器):

实体

/**
 * Period
 *
 * @ORM\Table(name="period")
 * @ORM\Entity(repositoryClass="Acme\DemoBundle\Entity\PeriodRepository")
 */
class Period {
    /** 
     * @var integer
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Task", inversedBy="periods")
     */
    private $task;
}

/**
 * Task
 *
 * @ORM\Table(name = "task")
 * @ORM\Entity(repositoryClass="Acme\DemoBundle\Entity\TaskRepository")
 */
class Task
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(name="type", type="integer")
     */
    private $type;

    /**
     * @ORM\OneToMany(targetEntity="Period", mappedBy="task")
     */
    private $periods;
}

过滤

namespace Acme\DemoBundle\Doctrine\Filter;

use Acme\DemoBundle\Entity\Task;

use Doctrine\ORM\Query\Filter\SQLFilter;
use Doctrine\ORM\Mapping\ClassMetadata;

/**
 * DisableTasksFilter excludes tasks from Doctrine results.
 */
class DisableTasksFilter extends SQLFilter
{
    const NAME = 'acme_disable_tasks';

    /**
     * @inheritdoc
     */
    public function addFilterConstraint(ClassMetadata $entity, $alias)
    {
        // Ignore tasks with type = 1
        if ($entity->getReflectionClass()->name === Task::class) {
            return "$alias.type != 1";
        }

        return '';
    }
}

但......(问题)

过滤器应该仅用于直接获取Task个实体,并且不应该在Task实体中过滤Period关系,也不应该在查询中加入实体(它可能会破坏某些逻辑)。

在我们的应用中,提取Task的地方很少:

  • TaskManager种方法
  • TaskRepositoryTaskManager中直接使用
  • User->tasks关系(通过使用ArrayCollection::filter()过滤集合的帮助方法)
  • Period->task relation

如果可以使用全局注册的过滤器过滤它,而不是为每个提取Task的地方添加条件,那将会容易得多。

甚至可能吗?

0 个答案:

没有答案