#php #doctrine-orm #doctrine
#php #doctrine-orm #доктрина
Вопрос:
У меня проблема с сбросом 2 связанных объектов (ManyToOne, OneToMany).
Я на Symfony 5.1.
Я просто хочу сохранить одну «UserSavedCard» со многими объектами «UserCartSavedProducts».
Но у меня возникает ошибка, когда я сбрасываю свои объекты, и эта ошибка появляется в этом файле «в vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php (строка 3013)»
Моя функция, которая выдает ошибку :
/**
* Save current user cart in database for later
* @param string|null $title
*/
public function saveCart(?string $title)
{
$cart = $this->getCart();
$cartSaved = new UserCartSaved();
$cartSaved->setUser($this->security->getUser());
$this->em->persist($cartSaved);
foreach ($cart as $item) {
$savedProduct = new UserCartSavedProducts();
$savedProduct->setProduct($item['product']);
$savedProduct->setUserCartSaved($cartSaved);
$this->em->persist($savedProduct);
}
$this->em->flush();
}
Когда я выполняю этот код выше, но у меня возникает эта ошибка :
Notice: Undefined index: 000000007e86ae93000000003f3a2fbb
Есть мои объекты :
UserCartSaved:
<?php
namespace AppEntity;
use AppRepositoryUserCartSavedRepository;
use DateTime;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;
use SymfonyComponentValidatorConstraintsDate;
/**
* @ORMEntity(repositoryClass=UserCartSavedRepository::class)
*/
class UserCartSaved
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMManyToOne(targetEntity=User::class, inversedBy="userCartSaveds")
* @ORMJoinColumn(nullable=false)
*/
private $user;
/**
* @ORMOneToMany(targetEntity=UserCartSavedProducts::class, mappedBy="userCartSaved")
*/
private $userCartSavedProducts;
/**
* @ORMColumn(type="datetime")
*/
private $createdAt;
public function __construct()
{
$this->userCartSavedProducts = new ArrayCollection();
$this->createdAt = new DateTime();
}
public function getId(): ?int
{
return $this->id;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
/**
* @return Collection|UserCartSavedProducts[]
*/
public function getUserCartSavedProducts(): Collection
{
return $this->userCartSavedProducts;
}
public function addUserCartSavedProduct(UserCartSavedProducts $userCartSavedProduct): self
{
if (!$this->userCartSavedProducts->contains($userCartSavedProduct)) {
$this->userCartSavedProducts[] = $userCartSavedProduct;
$userCartSavedProduct->setUserCartSaved($this);
}
return $this;
}
public function removeUserCartSavedProduct(UserCartSavedProducts $userCartSavedProduct): self
{
if ($this->userCartSavedProducts->contains($userCartSavedProduct)) {
$this->userCartSavedProducts->removeElement($userCartSavedProduct);
// set the owning side to null (unless already changed)
if ($userCartSavedProduct->getUserCartSaved() === $this) {
$userCartSavedProduct->setUserCartSaved(null);
}
}
return $this;
}
public function getCreatedAt(): ?DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
}
UserCartSavedProducts :
<?php
namespace AppEntity;
use AppRepositoryUserCartSavedProductsRepository;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity(repositoryClass=UserCartSavedProductsRepository::class)
*/
class UserCartSavedProducts
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMManyToOne(targetEntity=UserCartSaved::class, inversedBy="userCartSavedProducts")
* @ORMJoinColumn(nullable=false)
*/
private $userCartSaved;
/**
* @ORMManyToOne(targetEntity=Product::class, inversedBy="userCartSavedProducts", cascade={"persist"})
* @ORMJoinColumn(nullable=false)
*/
private $product;
public function getId(): ?int
{
return $this->id;
}
public function getUserCartSaved(): ?UserCartSaved
{
return $this->userCartSaved;
}
public function setUserCartSaved(?UserCartSaved $userCartSaved): self
{
$this->userCartSaved = $userCartSaved;
return $this;
}
public function getProduct(): ?Product
{
return $this->product;
}
public function setProduct(?Product $product): self
{
$this->product = $product;
return $this;
}
}
Продукт
<?php
namespace AppEntity;
use AppRepositoryProductRepository;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity(repositoryClass=ProductRepository::class)
*/
class Product
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMOneToMany(targetEntity=UserCartSavedProducts::class, mappedBy="product")
*/
private $userCartSavedProducts;
public function __construct()
{
$this->userCartSavedProducts = new ArrayCollection();
}
/**
* @return Collection|UserCartSavedProducts[]
*/
public function getUserCartSavedProducts(): Collection
{
return $this->userCartSavedProducts;
}
public function addUserCartSavedProduct(UserCartSavedProducts $userCartSavedProduct): self
{
if (!$this->userCartSavedProducts->contains($userCartSavedProduct)) {
$this->userCartSavedProducts[] = $userCartSavedProduct;
$userCartSavedProduct->setProduct($this);
}
return $this;
}
public function removeUserCartSavedProduct(UserCartSavedProducts $userCartSavedProduct): self
{
if ($this->userCartSavedProducts->contains($userCartSavedProduct)) {
$this->userCartSavedProducts->removeElement($userCartSavedProduct);
// set the owning side to null (unless already changed)
if ($userCartSavedProduct->getProduct() === $this) {
$userCartSavedProduct->setProduct(null);
}
}
return $this;
}
}
Комментарии:
1. Попробуйте запустить doctrine:schema:validate, чтобы убедиться, что ваша схема верна
2. Здравствуйте, я уже пробовал, и все «ОК».
Ответ №1:
Я столкнулся с проблемой, получающей ту же ошибку, и в моем случае это то, что я сохранял объект entity в сеансе и пытался удалить его «как есть» после извлечения. Несмотря на то, что я мог извлечь и сбросить объект, и все казалось нормальным (до сброса), мне сказали, что EM потерял управление содержимым. Итак, чтобы вернуть управление, мне пришлось извлекать каждый отдельный идентификатор каждого компонента сохраненного объекта через его собственный получатель, а затем через find извлекать их все и снова устанавливать их в новый экземпляр объекта.