Связь через события между сущностью и ее хранилищем в Doctrine2 - PullRequest
2 голосов
/ 24 октября 2011

Я начинаю использовать Doctrine 2 в проекте с сущностью «Группа», которая может наследоваться от другой группы, имеющей следующую схему: id | parent_id | name

Поскольку иерархия может углубляться, я используютаблица связывания "group_group", использующая эту схему: ancestor_id | descendant_id | depth

Идея состоит в том, что любая группа связана со всеми ее предками и потомками, а поле depth указывает расстояние отношения,так что мне не нужно перебирать родителей или детей, использующих много SQL-запросов, один может получить все результаты.Я попытался использовать отношение ManyToMany в Doctrine, но не смог упорядочить его по полю depth, поэтому вместо этого я использую репозиторий сущности для получения связанных предков и потомков.

Поскольку сущность можетне получая доступ к своему хранилищу, я хотел бы знать, существует ли у сущности способ отправлять события, которые могут прослушиваться его хранилищем, так что, когда сущность пытается получить доступ к своим предкам / потомкам, хранилище может ответить?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 25 ноября 2011

У Entity не должно быть конкретной ссылки на Repository, но в определении Interface нет ничего плохого, и ваш Repository реализует этот интерфейс и вводит его в Entity.

Аналогично этому решению Doctine 2 Ограничение связей с DQL

interface TreeInterface
{
   public function findParent();
   public function findChildren();
}

Тогда ваши сущности.

class Group
{
    $repository;

    setRepository(TreeInterface $repository)
    {
        $this->tree = $repository;
    }

    public function getParent()
    {
        return $this->repository->findParent($this);
    }

    public function getChildren()
    {
         return $this->repository->findChildren($this);
    }
}

class GroupRepository extends EntityRepository implements TreeInterface
{
    public function findParent(Group $group)
    {
        return //stuff
    }

    public function findChildren(Group $group)
    {
        return //stuff
    }
}

И вы используете его таким образом.

$group = $em->find('Group', 1);
$group->setRepository($em->getRepository('Group'));
$children = $group->getChildren();

Чтобы не устанавливать репозиторий каждый раз, когда вы получаете ребенка, я бы посмотрел на события EventManager и postLoad и посмотрел, можно ли вставить TreeInterface в Entity при загрузке.

...