Symfony ManyToMany, как получить объект, связанный с другим объектом - PullRequest
0 голосов
/ 01 февраля 2020

Я не понимаю, как получить доступ к продукту, связанному с CartLine.

У меня есть два объекта

Объект CartLine:

  /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Product", inversedBy="cartLines")
     * @ORM\JoinTable(name="cart_line_product")
     */
    private $product;

    public function __construct()
    {
        $this->product = new ArrayCollection();
    }

    /**
     * @return Collection|Product[]
     */
    public function getProduct(): Collection
    {
        return $this->product;
    }

Сущность товара:

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\CartLine", mappedBy="product")
     */
    private $cartLines;

    public function __construct()
    {
        $this->cartLines = new ArrayCollection();
    }
    /**
     * @return Collection|CartLine[]
     */
    public function getCartLines(): Collection
    {
        return $this->cartLines;
    }

Далее я добавляю товар в корзину через форму, например так:

if ($form->isSubmitted() && $form->isValid()) {

            $cartLine = new CartLine();
            $cartLine->addProduct($product);

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

Товар добавляется, как и ожидалось.

Затем я пытаюсь отобразить продукты в корзине:

       $id = $this->getUser()->getCart()->getId();
        $cartline = $cartLineRepo->findAllCartLineByUser($id);

, затем в шаблоне

{% for cart in cartline.id %} //OR {% for cart in cartline.product.id %}
 <div class="item">
</div>
{% endfor %}

Я получаю ошибку Key "id" for array with keys "0, 1, 2, 3" does not exist

Или вызов в контроллере

$cart = $this->getDoctrine()->getRepository(CartLine::class)->findAll();
        foreach ($cart as $value){
            $id = $value->getProduct()->getId();
        }

Я получаю ошибку Attempted to call an undefined method named "getId" of class "Doctrine\ORM\PersistentCollection".

Как получить связанный объект или как его исправить?

1 Ответ

0 голосов
/ 02 февраля 2020

Здесь у вас есть отношение ManyToMany, а не ManyToOne (множество корзин к одному товару)

Таким образом, $value->getProduct() возвращает ArrayCollection, а не одно product.
Вот почему getId() не работает, потому что это не product объект.

У меня такое ощущение, что вам больше нужны отношения ManyToOne <=> OneToMany, чем ManyToMany

Если вы уверены, что вам нужно отношение ManyToMany, то вот как должен быть ваш код

$cartLines=$this->getDoctrine()->getRepository(CartLine::class)->findAll();

foreach($cartLines as $cartLine) {
    $products=$cartLine->getProduct(); //ArrayCollection

    foreach($products as $product) {
        $id=$product->getId();
    }
}
...