Получатель объекта из JSON-поля

У меня есть 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)
}

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

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

AnTrakS 07.12.2018 12:37

Да много отношений

olek07 07.12.2018 12:38

Вся конструкция очень сложная. Я хочу добиться, получить весь объект Opponent одним методом $ process-> getOpponent ();

olek07 07.12.2018 12:42

Поскольку мы не можем видеть структуру сущностей, я думаю, что лучший способ добиться этого - использовать связь / связь доктрины -> symfony.com/doc/current/doctrine/associations.html

AnTrakS 07.12.2018 12:49

связь / связь с JSON-полем? Боюсь, это невозможно.

olek07 07.12.2018 12:51

В чем причина поля json?

mblaettermann 07.12.2018 13:09

Данные поступают из формы, которая может иметь разные поля и структуру.

olek07 07.12.2018 13:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
349
1

Ответы 1

Вы не должны внедрять диспетчер сущностей в сущность, это очень плохая практика и нарушает разделение задач между классами. НО, если вы действительно хотите, вы действительно можете ввести диспетчер сущностей в свою сущность.

ХОРОШАЯ ПРАКТИКА:

Создайте класс 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. Но что вы имеете в виду под моделью / процессом? Я этого не понимаю. Не могли бы вы объяснить поподробнее?

olek07 07.12.2018 13:04

Решение с onPostLoad работает, если я получаю данные с помощью $ this-> getDoctrine () -> getRepository (Process :: class) -> find (20‌ 00000); Но не работает, если я получаю данные с помощью построителя запросов $ qb = $ this-> createQueryBuilder ('p') -> select ('p') -> where ('p.id =: processId') -> setParameter ('processId', 2000000);

olek07 07.12.2018 13:48

Отредактировал свой ответ, чтобы лучше объяснить предложение модели / процесса. Это более сложное решение.

iiirxs 07.12.2018 13:52

Другие вопросы по теме