У меня есть 2 объекта:
class Opponent
{
...
...
...
}
class Process
{
/**
* @var array
*
* @ORM\Column(name = "answers_in_related_questionnaires", type = "json", nullable=true)
*/
private $answersInRelatedQuestionnaires = [];
.
.
.
}
У меня есть в поле answersInRelatedQuestionnaires, среди прочего, объект оппонент
"opponent": {
"id":1088,
"name":"Inora Life Versicherung"
}
Я хочу написать геттер в процессе сущности, который получает не только оба значения id и имя от оппонента, но и весь оппонент сущности. Что-то вроде этого:
private function getOpponent() : Opponent
{
$id = $this->answersInRelatedQuestionnaires['opponent']['id'];
return $entityManager->getRepository(Opponent::class)->find($id)
}
Я читал, что использование диспетчера сущностей внутри сущности - не лучшая идея. Какие есть решения моей проблемы? Могу ли я использовать репозиторий процесса в сущности процесса?
Да много отношений
Вся конструкция очень сложная. Я хочу добиться, получить весь объект Opponent одним методом $ process-> getOpponent ();
Поскольку мы не можем видеть структуру сущностей, я думаю, что лучший способ добиться этого - использовать связь / связь доктрины -> symfony.com/doc/current/doctrine/associations.html
связь / связь с JSON-полем? Боюсь, это невозможно.
В чем причина поля json?
Данные поступают из формы, которая может иметь разные поля и структуру.






Вы не должны внедрять диспетчер сущностей в сущность, это очень плохая практика и нарушает разделение задач между классами. НО, если вы действительно хотите, вы действительно можете ввести диспетчер сущностей в свою сущность.
ХОРОШАЯ ПРАКТИКА:
Создайте класс Model/Process и включите в него любые функции, относящиеся к вашей модели. Сущности Doctrine не являются модельными классами. В Model/Process вы можете внедрить диспетчер сущностей и любую другую нужную вам службу.
РЕДАКТИРОВАТЬ: Создавая класс Model/Process, я имею в виду создание класса с именем Process внутри каталога Model в вашей папке /src. Ваш путь к вашему классу будет: /src/Model/Process. Конечно, имя каталога или класса может быть любым, но это типичное соглашение. Ваш класс Model должен отвечать за всю вашу бизнес-логику, такую как проверка вашей модели и т. д. Это действительно усложнит структуру вашего кода, но в долгосрочной перспективе будет выгодно для крупномасштабных проектов. Вам также понадобится Model/ProcessManager для правильного заполнения модели процесса в различных случаях (например, при загрузке из базы данных, пользовательской формы и т. д.). Конечно, в конце концов, все это вопрос компромисса между сложностью и устойчивостью.
Интересный подход к моделям в Symfony, наиболее применимый в крупномасштабных проектах, можно найти в здесь.
АЛЬТЕРНАТИВЫ:
Если вы обращаетесь к атрибуту opponent только после загрузки объекта, вы можете использовать Doctrine PostLoad LifecycleCallback для правильной установки атрибута opponent. Это неплохая практика:
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
/**
* @ORM\Entity()
* @ORM\HasLifecycleCallbacks()
*/
class Product
{
// ...
private $opponentObject;
/**
* @ORM\PostLoad
*/
public function onPostLoad(LifecycleEventArgs $args){
$em = $args->getEntityManager();
$id = $this->answersInRelatedQuestionnaires['opponent']['id'];
$this->opponentObject = $em->getRepository(Opponent::class)->find($id);
}
public function getOpponent() {
return $this->opponent;
}
}
Наконец, если вы действительно хотите внедрить диспетчер сущностей в свою сущность, вы можете добиться этого с помощью инъекции зависимостей через автоматическое подключение:
use Doctrine\ORM\EntityManagerInterface;
class Process
{
private $em;
public function __contruct(EntityManagerInterface $em)
{
$this->em = $em;
}
....
}
Нет, я не хочу вводить диспетчер сущностей. Я знаю, это очень плохая практика. Мне интересно решение с onPostLoad. Но что вы имеете в виду под моделью / процессом? Я этого не понимаю. Не могли бы вы объяснить поподробнее?
Решение с onPostLoad работает, если я получаю данные с помощью $ this-> getDoctrine () -> getRepository (Process :: class) -> find (20 00000); Но не работает, если я получаю данные с помощью построителя запросов $ qb = $ this-> createQueryBuilder ('p') -> select ('p') -> where ('p.id =: processId') -> setParameter ('processId', 2000000);
Отредактировал свой ответ, чтобы лучше объяснить предложение модели / процесса. Это более сложное решение.
Есть ли между сущностями какие-либо отношения? Возможно, вам стоит опубликовать структуру своих сущностей и то, чего вы пытаетесь достичь.