сущность доктрины 2 не заполнена дочерним элементом - PullRequest
0 голосов
/ 04 июля 2019

В моей базе данных есть две связанные таблицы.

AppBooking

AppBookingService

AppBookingService имеет внешний ключ для AppBooking

Я использую этот метод длясделайте вставку как в первую, так и во вторую таблицу.

public function bookingExecute($data){
    try{
        $this->em->beginTransaction();
        $appBooking = $this->_fillAppBooking($data);
        $this->em->persist($appBooking);
        if(array_key_exists("appService",$data) && is_array($data['appService']) && count($data['appService']) > 0){
            foreach($data['appService'] as  $bookingService){
                $appBookingService = $this->_fillAppBookingService($bookingService,$appBooking);
                $this->em->persist($appBookingService);
                $this->em->flush();
            }
        }
        $this->em->flush();
        $this->em->commit();
        return $appBooking;
    }catch (\Exception $ex){
        $this->em->rollback();
        throw new BookingException("",BookingError::BOOKING_QUERY_ERROR);
    }
}

Данные записаны правильно

После этого в том же http-запросе я вызываю приведенный ниже метод для получения AppBooking.Данные службы в моей сущности

$appBooking = $this->bookingService->findOne($id);

Проблема в том, что полученная сущность AppBooking не содержит AppBookingService

Метод

$appBooking->getServices()->count()

возвращает 0

Если я сделаю тот же вызов в другом http-запросе, я получу желаемый результат.

Как будто доктрина не обновила сущность в этом же запросе

Это часть AppBooking

/**
 * @var Collection
 * @ORM\OneToMany(targetEntity="AppBookingService", mappedBy="idBooking")
 */
private $services;

public function __construct() {
    $this->services = new ArrayCollection();
}

Это часть AppBookingService

/**
 * @var \Entity\Entity\AppBooking
 *
 * @ORM\ManyToOne(targetEntity="Entity\Entity\AppBooking", inversedBy="services")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="ID_BOOKING", referencedColumnName="ID_BOOKING", nullable=true)
 * })
 */
private $idBooking;

1 Ответ

1 голос
/ 06 июля 2019

Это потому, что при запуске

$appBooking = $this->bookingService->findOne($id);

объект извлекается из его внутреннего прокси-кэша.Не выполняется запрос к базе данных для получения данных объекта.То же самое верно для его уже загруженных ассоциаций. Прокси-кеш действителен при выполнении http-запроса.

Чтобы решить эту проблему, необходимо либо обновить коллекцию $services вручную, либо обновить сущность.

$this->em->refresh($appBooking);

Обновляет постоянное состояние объекта из базы данных, отменяя любые локальные изменения, которые еще не были сохранены.

Вы также можете очистить всего объектаКэш менеджера до вызова метода findOne ().

$this->em->clear();

Очищает EntityManager.Все сущности, которые в данный момент управляются этим EntityManager, становятся отсоединенными.

Ссылки

...