2015-10-08 3 views
0

У меня есть два объекта, пользователь и хранилище, они имеют отношение «много к одному», прежде чем я создаю пользователя, я должен убедиться, что существует хранилище, не создавать хранилище при создании пользователя, это означает, что каскад = {"persist"} не может использоваться.Почему доктрина думает о существовании сущности как о новом сущности?

класс Магазин

public function addUser(User $user) 
    { 
     if (!$this->users->contains($user)) 
     { 
      $this->users->add($user); 
      $user->setStore($this); 
     } 
     return $this; 
    } 

, прежде чем я создать пользователя, я уверен, что магазин уже existed.these код ниже способ я использовал для создания пользовательских

$store= $this->get('vmsp.store_provider')->getCurrentStore(); 
$store->addUser($user); 
$userManager->updateUser($user); 

код метод updateUser не является специальным:

$this->entityManager->persist($user); 
$this->entityManager->flush(); 

код в методе getCurrentStore:

public function getCurrentStore($throwException=true) 
    { 
     if (isset(self::$store)) { 
      return self::$store; 
     } 

     $request = $this->requestStack->getCurrentRequest(); 
     $storeId = $request->attributes->get('storeId', ''); 

     $store = $this->entityRepository->find($storeId); 
     if ($store === NULL&&$throwException) { 
      throw new NotFoundHttpException('Store is not found'); 
     } 
     self::$store = $store; 


     return $store; 
    } 

это дает мне ошибку:

A new entity was found through the relationship 'VMSP\UserBundle\Entity\User#store' that was not configured to cascade persist operations for entity: ~ #1. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"})

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

+0

Похож на '$ this-> get ('vmsp.store_provider') -> getCurrentStore();' на самом деле не возвращает объект Doctrine, поэтому Doctrine действительно не знает, что он сохраняется. Пожалуйста, покажите нам этот код .. – tchap

+0

@tcap, я обновил вопрос, как вы можете видеть, этот код вполне нормальный. этот код работает так, как ожидалось, в рабочей среде, но при тестировании магазин будет создан дважды, извините за то, что я не упоминал, что это произошло только в тестовой среде. –

+0

Не могли бы вы также добавить код для 'updateUser()' UserManager. В качестве побочной заметки вам следует избегать двунаправленных отношений (см. Docs [Best Practices-chapter] (https://doctrine-orm.readthedocs.org/en/latest/reference/best-practices.html#constrain-relationships-as-much -as-possible)) – dbrumann

ответ

0

Кажется, что ваш Store -entity как-то отделен от EntityManager. Я не могу понять, где это происходит. Обнаружение этого, вероятно, займет несколько отладочных сессий.

Быстрое исправление может заключаться в объединении магазина пользователя обратно в EntityManager с использованием EntityManager::merge($entity), например. в вашем updateUser-метод:

public function updateUser(User $user) { 
    $store = $user->getStore(); 
    $this->entityManager->merge($store); 
    $this->entityManager->persist($user); 
    $this->entityManager->flush(); 
} 

Вы также можете играть с Doctrine-х UnitOfWork особенно с getState($entity, $assumedState), чтобы выяснить, является ли ваш магазин по-прежнему управляется или нет.

Смежные вопросы