Учение Symfony OneToAll отношение - PullRequest
0 голосов
/ 03 сентября 2018

Я хочу создать своего рода ассоциацию «OneToAll» с доктриной

У меня есть две разные сущности, которые не связаны между собой. И я не хочу, чтобы они были сопоставлены с ассоциацией ManyToMany. Объекты содержат очень большое количество записей, и в этом случае мне нужно создать записи в таблице соединений для всех данных

Могу ли я создать собственное отношение доктрины, которое объединит одну сущность со всеми записями другой сущности? Это будет что-то вроде:

/**
 * One entityA has All entityB.
 * @ORM\OneToAll(targetEntity="EntityB")
 */
private $entitiesB;

Я нашел это в доктрине: https://www.doctrine -project.org / проекты / Доктрина-ОРМ / ы / 2,6 / ссылки / наследования mapping.html

Может ли это помочь мне в моих целях?

1 Ответ

0 голосов
/ 03 сентября 2018

Doctrine естественно не поддерживает это, поскольку - с точки зрения отображения базы данных - не имеет смысла загружать не связанные объекты всякий раз, когда выбирается один столбец из таблицы a. Это также может оказать серьезное влияние на производительность.

Исходя из того, что это звучит, вы должны либо рассматривать A и B по отдельности, либо найти другое решение для внесения изменений в A и B одновременно, например, предоставляя какой-либо Фасад или услугу, управляющую хранилищами обеих сущностей. Если вам это абсолютно необходимо, один из возможных вариантов: добавить еще один уровень абстракции, предоставив класс, содержащий как один объект EntityA, так и все объекты EntityB

class EntityAWithBs
{
    private $a;
    private $bs;

    public function __construct(EntityA $a, array $allBs)
    {
        $this->a = $a;
        $this->bs = $allBs;
    }

    public function getEntityA(): EntityA
    {
        return $this->a;
    }

    public function getAllBs(): array
    {
        return $this->bs;
    }
}

Затем вы можете создать класс, например, собственный репозиторий или добавить следующий метод в ваш EntityA-репозиторий:

public function getAWithAllBs($id): EntityAWithBs
{
    $a = $this->entityManager->getRepository('EntityA')->find($id);
    $bs = $this->entityManager->getRepository('EntityB')->findAll();

    return new EntityAWithBs($a, $bs);
}

Всякий раз, когда вам нужен объект A со всеми объектами B одновременно, вы можете просто вызвать метод репозитория. Вы также можете расширить этот пример, чтобы иметь службу, которая выполняет действия над вновь созданным EntityAWithBs, такие как изменение данных и их сохранение.

Пожалуйста, имейте в виду, что это все еще имеет некоторые изначально отмеченные недостатки, такие как возможные проблемы с производительностью, например, связанные с использованием памяти. Без какого-либо знания о том, что вы пытаетесь достичь с помощью этого отношения, это лучшее, что я могу придумать.

...