如何(在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
种方法TaskRepository
在TaskManager
中直接使用User->tasks
关系(通过使用ArrayCollection::filter()
过滤集合的帮助方法)Period->task
relation 如果可以使用全局注册的过滤器过滤它,而不是为每个提取Task
的地方添加条件,那将会容易得多。
甚至可能吗?