Problém s načítáním špatné entity

jAkErCZ
Člen | 321
+
0
-

Zdravím,
mám formulář ve kterém chci uložit data po úpravě. Ale v entitě se načítá úplně jiná entita než jaká je definovaná a už si opravdu nevím rady kde je problém.

Expected value of type "App\Model\Database\Entity\Order" for association field "App\Model\Database\Entity\ExhibitorExposition#$order", got "App\Model\Database\Entity\Exhibitor" instead.

Kód

/** @var ExhibitorExposition $exposition */
       foreach ($this->exhibitor->getExpositions() as $exposition) {
           bdump($exposition);
           $exposition->setEquipments(new ArrayCollection());
           $exposition->setStands(new ArrayCollection());
           //bdump($exposition);
           $this->em->flush($exposition); -- zde je chyba
       }

Dump

exposition private => App\Model\Database\Entity\Exposition
order private => App\Model\Database\Entity\Exhibitor -- Zde se má načítat entita Order
equipments private =>  Doctrine\ORM\PersistentCollection
stands private => Doctrine\ORM\PersistentCollection

Entita **ExhibitorExposition **

<?php

declare(strict_types=1);

namespace App\Model\Database\Entity;

use App\Model\Database\BaseEntity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Nettrine\ORM\Entity\Attributes\Id;

/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="exhibitor__exposition")
 */
class ExhibitorExposition extends BaseEntity {

    use Id;

    /**
     * @ORM\ManyToOne(targetEntity="Exposition", inversedBy="exhibitors")
     * @ORM\JoinColumn(name="exposition_id", referencedColumnName="id")
     * @var Exposition
     */
    private $exposition;

    /**
     * @ORM\ManyToOne(targetEntity="Order", inversedBy="expositions")
     * @ORM\JoinColumn(name="order_id", referencedColumnName="id")
     * @var Order
     */
    private $order;

    /**
     * @ORM\OneToMany(targetEntity="ExhibitorExpositionEquipment", mappedBy="exhibitorExposition", fetch="EXTRA_LAZY", cascade={"all"}, orphanRemoval=true)
     * @ORM\OrderBy({"id" = "ASC"})
     * @var Collection
     */
    private $equipments;

    /**
     * @ORM\OneToMany(targetEntity="ExhibitorExpositionStand", mappedBy="exhibitorExposition", fetch="EXTRA_LAZY", cascade={"all"}, orphanRemoval=true)
     * @ORM\OrderBy({"id" = "ASC"})
     * @var Collection
     */
    private $stands;

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

    /**
     * @return Exposition
     */
    public function getExposition(): Exposition {
        return $this->exposition;
    }

    /**
     * @param Exposition $exposition
     */
    public function setExposition(Exposition $exposition): void {
        $this->exposition = $exposition;
    }

    /**
     * @return Order
     */
    public function getOrder(): Order {
        return $this->order;
    }

    /**
     * @param Order $order
     */
    public function setOrder(Order $order): void {
        $this->order = $order;
    }

    /**
     * @return Collection
     */
    public function getEquipments(): Collection {
        return $this->equipments;
    }

    /**
     * @param Collection $equipments
     */
    public function setEquipments(Collection $equipments): void {
        $this->equipments = $equipments;
    }

    /**
     * @return Collection
     */
    public function getStands(): Collection {
        return $this->stands;
    }

    /**
     * @param Collection $stands
     */
    public function setStands(Collection $stands): void {
        $this->stands = $stands;
    }

    public function getPrice() {
        $price = 0;

        /** @var ExhibitorExpositionStand $stand */
        foreach ($this->stands as $stand) {
            $price += $stand->getPrice();

        }

        /** @var ExhibitorExpositionEquipment $equipment */
        foreach ($this->equipments as $equipment) {
            $price += $equipment->getPrice();
        }

        return $price;
    }

    public function getStandPairs() {
        $ids = [];

        /** @var ExhibitorExpositionStand $stand */
        foreach ($this->stands as $stand) {
            $ids[] = $stand->getStand()->getId();
        }

        return $ids;
    }

    public function getEquipmentByNecessary($isNecessary = true) {
        $result = [];

        /** @var ExhibitorExpositionEquipment $equipment */
        foreach ($this->equipments as $equipment) {
            if ($equipment->getEquipment()->isNecessary() == $isNecessary) {
                $result[] = $equipment;
            }
        }

        return $result;
    }

}

Zde mám provázání order s entitou order ale absolutně ji to ignoruje…

Proč?

Díky všem za rady :)

Mistrfilda
Člen | 76
+
0
-

Ahoj,

neukázal si kód kde se volá $exposition->setOrder(), voláš to někde? Protože ta chyba je dost zvláštní, u setteru je daný typehint.

jAkErCZ
Člen | 321
+
0
-

Mistrfilda napsal(a):

Ahoj,

neukázal si kód kde se volá $exposition->setOrder(), voláš to někde? Protože ta chyba je dost zvláštní, u setteru je daný typehint.

Jo promiň sem vůl.

Tady je celý část kódu který to zpracovává

/**
    * @param Form $form
    * @throws AbortException
    */
   public function processExhibitorForm(Form $form): void {
       $values = $form->getValues();

       if (!$this->exhibitor) {
           $this->exhibitor = new Exhibitor();
       }

       $this->exhibitor->setCompany($values->company);
       $this->exhibitor->setCompanyId($values->companyId);
       $this->exhibitor->setStreet($values->street);
       $this->exhibitor->setStreetNumber($values->streetNumber);
       $this->exhibitor->setTown($values->town);
       $this->exhibitor->setZip($values->zip);
       $this->exhibitor->setSocial($values->social);
       $this->exhibitor->setCompanyVat($values->companyVat);
       $this->exhibitor->setContactName($values->contactName);
       $this->exhibitor->setEmail($values->contactEmail);
       $this->exhibitor->setContactEmail($values->contactEmail);
       $this->exhibitor->setContactPhone($values->contactPhone);


       foreach ($this->exhibitorManager->getPromos() as $promo) {
           if (!$values['promo_' . $promo->id]) {
               continue;
           }

           bdump($this->promo_order);
           $value = array_diff($this->promo_order, array($values['promo_' . $promo->id]));

       bdump($value);
          // $this->actionManager->createExpositionPromo($promo->id, $order->id);
       }
       /** @var ExhibitorExposition $exposition */
       foreach ($this->exhibitor->getExpositions() as $exposition) {
           bdump($exposition);
           $exposition->setEquipments(new ArrayCollection());
           $exposition->setStands(new ArrayCollection());
           //bdump($exposition);
           $this->em->flush($exposition);
       }
       $this->exhibitor->setExpositions(new ArrayCollection());

       $this->em->persist($this->exhibitor);

       /** @var Exposition $exposition */
       foreach ($this->em->getExpositionRepository()->findAll() as $exposition) {
           if (!$values['exposition_' . $exposition->getId()]) {
               continue;
           }

           $exhibitorExposition = new ExhibitorExposition();
           $exhibitorExposition->setOrder($this->order);
           $exhibitorExposition->setExposition($exposition);

           $this->em->persist($exhibitorExposition);
           $this->exhibitor->getExpositions()->add($exhibitorExposition);

           foreach ($values['stands_' . $exposition->getId()] as $standId) {
               /** @var Stand $stand */
               $stand = $this->em->getStandRepository()->findById($standId);

               $exhibitorExpositionStand = new ExhibitorExpositionStand();
               $exhibitorExpositionStand->setPrice($stand->getPrice());
               $exhibitorExpositionStand->setStand($stand);
               $exhibitorExpositionStand->setExhibitorExposition($exhibitorExposition);

               $this->em->persist($exhibitorExpositionStand);
               $exhibitorExposition->getStands()->add($exhibitorExpositionStand);
           }

           /** @var Equipment $equipment */
           foreach ($exposition->getEquipments() as $equipment) {
               if (!$values['equipment_' . $equipment->getId()] && !$equipment->isNecessary()) {
                   continue;
               }

               $exhibitorExpositionEquipment = new ExhibitorExpositionEquipment();
               $exhibitorExpositionEquipment->setPrice($equipment->getPrice());
               $exhibitorExpositionEquipment->setEquipment($equipment);
               $exhibitorExpositionEquipment->setExhibitorExposition($exhibitorExposition);

               $this->em->persist($exhibitorExpositionEquipment);
               $exhibitorExposition->getEquipments()->add($exhibitorExpositionEquipment);
           }
       }

       $this->em->flush();

       $this->getPresenter()->flashMessage('Objednávka úspěšně uložena', 'success');
       //$this->getPresenter()->redirect('default');
   }

Jde o to že setOrder() volám později ten order dle dumpu tam už je dozasený proto si myslím že by to nemělo mít na to vliv jelikož ten order tam dosazuje ta entita ExhibitorExposition která si myslím že je dobře směřovaná.

Editoval jAkErCZ (3. 6. 2020 18:28)

Mistrfilda
Člen | 76
+
0
-

To je hodně zvláštní. Tipuji že se to stává pouze pro existující entity, ne pro nové? Nikde tam nevidím, že by se settovala order na něco jiného. Pro nové objednávky by ten první foreach neměl vracet žádné záznamy. Jestli je to pouze pro existující, když si zkusíš tu entitu vyžádat napřímo a dumpnout $exposition->getOrder() tak to vrací type error?