Symfony / Doctrine Уведомление: неопределенный индекс: 000*

#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 извлекать их все и снова устанавливать их в новый экземпляр объекта.