smidl
@smidl
WordPress-разработчик

Undefined Index при попытке создать связь между сущностями?

Есть сущности Order и Product. Между ними прописана связь ManyToMany:

App\Entity\Order.php

/**
 * @ORM\ManyToMany(targetEntity=Product::class, inversedBy="orders", cascade={"persist"})
 */
private $products;


App\Entity\Product.php

/**
 * @ORM\ManyToMany(targetEntity=Order::class, mappedBy="products")
 */
private $orders;


В сущности Order есть метод для добавления связанных продуктов:

public function addProduct(Product $product): self
{
    if (!$this->products->contains($product)) {
        $this->products[] = $product;
    }

    return $this;
}


Вот код, которым создаю пользователя, заказ и привязываю к заказу продукты из корзины пользователя. Именно здесь и происходит ошибка. В $product['product'] экземпляр класса Product из корзины.

App\Controller\CheckoutController.php

$user = new User();
$password = $this->encoder->encodePassword($user, $data['password']);
$user->setEmail($data['email']);
$user->setUsername($data['username']);
$user->setFirstName($data['first_name']);
$user->setLastName($data['last_name']);
$user->setPassword($password);
$user->setRoles('ROLE_USER');

$em->persist($user);
$em->flush();

//Создаем новый заказ.
$order = new Order();
$order->setUserId($user);
$order->setDate(new \DateTime());
$order->setStatus('new');
$order->setTotal($this->cartService->getTotal());
        
//Проблемный участок кода. Без него все работает нормально
foreach ($this->cartService->getCartContent() as $product) {
   $order->addProduct($product['product']);
}

$em->persist($order);

$em->flush(); // Ошибка на данной строке, судя по дебаггеру Симфони.


Ниже скриншот ошибки. Насколько я понимаю, он не может корректно проставить связи между заказом и продуктами из заказа.

5faac903b64cd120656146.png
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
glaphire
@glaphire
PHP developer
Такая ошибка вылезает если объект в связи уже не в объекте UnitOfWork. Эта ошибка может быть вызвана неправильной версией доктрины ( на гитхабе были issues), но мне кажется что Вы не должны добавлять flush после каждого persist здесь, т.е. надо сделать персист юзера, заказов и добавленных продуктов, а потом уже все зафлашить один раз
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы