У меня есть два объекта, пользователь и хранилище, они имеют отношение «много к одному», прежде чем я создаю пользователя, я должен убедиться, что существует хранилище, не создавать хранилище при создании пользователя, это означает, что каскад = {"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"})
вещь становится очень интересно, почему делает существовавший магазин стать новым лицом? почему доктрина считает, что существующий объект хранилища является новым объектом?
Похож на '$ this-> get ('vmsp.store_provider') -> getCurrentStore();' на самом деле не возвращает объект Doctrine, поэтому Doctrine действительно не знает, что он сохраняется. Пожалуйста, покажите нам этот код .. – tchap
@tcap, я обновил вопрос, как вы можете видеть, этот код вполне нормальный. этот код работает так, как ожидалось, в рабочей среде, но при тестировании магазин будет создан дважды, извините за то, что я не упоминал, что это произошло только в тестовой среде. –
Не могли бы вы также добавить код для 'updateUser()' UserManager. В качестве побочной заметки вам следует избегать двунаправленных отношений (см. Docs [Best Practices-chapter] (https://doctrine-orm.readthedocs.org/en/latest/reference/best-practices.html#constrain-relationships-as-much -as-possible)) – dbrumann