Problém s insertom do databázi pomocov Doctrine 2

- KristianSubweb
 - Člen | 146
 
Ahoj chel by som sa Vás opýtať mám taký problém, snažím sa do databázi uložiť vozidlo s idečkom už exisstujúceho zákazníka.
Toto je form toho vozidla
public function add(Form $form)
    {
        // Dáta s formulárov
        $data = $form->getValues(true);
        $stk = $form->getHttpData()["stk"];
        $oilChange = $form->getHttpData()["stk"];
        $contactId = $form->getHttpData()["contactId"];
        //Vyťiahnutie konkrétneho zákazníka ktorému chcem pridať vozidlo
        $contact = $this->contactService->getById($contactId);
        //Vytvorenie classi daného vozidla / a naplnenie dátami
        $car = $this->hydratorService->fromArray($data, new Cars(), ["stk", "oilChange", "yearOr", "contactId"]);
        $car->setStk(DateTime::createFromFormat("Y-m-d", $stk));
        $car->setOilChange(DateTime::createFromFormat("Y-m-d", $oilChange));
        $multimediaSaver = $this->iMultimediaSaver->create($data["multimedia"]);
        if ($multimediaSaver->isImage()) {
            $multimedia = $multimediaSaver->saveAsImage("multimedia/cars/");
            $car->setMultimedia($multimedia);
        }else {
            $car->setMultimedia(NULL);
        }
		//Tu pridávam vozidlo do kolekcie
        $contact->addCar($car);
        $this->contactService->insert($contact);
        $log = new Log();
        $log->setDescriptionAndEncode("Bolo pridane vozidlo ");
        $log->setUser($this->user->getEntity());
        $log->setResource("is.modulName.cars");
        $this->logService->insert($log);
    }
Entity vizerajú takto.
Entity Zákazníka:
/**
 * @ORM\Entity
 * @ORM\Table(name="contact")
 */
class Contact extends DefaultEntity {
    use \Kdyby\Doctrine\Entities\MagicAccessors;
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;
...
    /**
     * @ORM\OneToMany(targetEntity="CarsModule\Entities\Cars", mappedBy="contact", cascade={"persist"})
     */
    protected $cars;
    public function __construct()
    {
        $this->cars = new ArrayCollection();
    }
A Entita Vozidla:
/**
 * @ORM\Entity
 * @ORM\Table(name="cars")
 */
class Cars extends DefaultEntity {
    use \Kdyby\Doctrine\Entities\MagicAccessors;
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;
    /**
     * @ORM\ManyToOne(targetEntity="ContactModule\Entities\Contact", inversedBy="cars", cascade={"persist"})
     */
    protected $contact;
    /**
     * @ORM\Column(type="integer")
     */
    protected $contactId;
	...
	 public function __construct()
    {
        $this->contact = new ArrayCollection();
    }
Hádam to bude stačiť k popísaniu problému Ďakujem.

- KristianSubweb
 - Člen | 146
 
Ano prepáč až teraz som si všimol že som nepopísal chybu :D
Po odoslani my vyhodí toto.
Doctrine\ORM\ORMInvalidArgumentException
Expected value of type „ContactModule\Entities\Contact“ for association field „CarsModule\Entities\Cars#$contact“, got „Doctrine\Common\Collections\ArrayCollection“ instead.

- KristianSubweb
 - Člen | 146
 
Už som odstránil s Entity Cars
public function __construct()
{
$this->contact = new ArrayCollection();
 }
A už mi to to vozidlo normálne vytvorí ale stále bez id toho konkrétneho zákazníka?

- David Matějka
 - Moderator | 6445
 
nestaci pridat auto do kolekce u Contact::$cars, dulezita je
owning side te relace, coz je v tomhle pripade Car::$contact, vice
v doc
obecne reseni, aby fungovalo volani z obou stran je neco takoveho:
class Car
{
	...
	public function setContact(Contact $contact)
	{
		$this->contact = $contact;
		$contact->addCar($this);
	}
}
class Contact
{
	public function addCar(Car $car)
	{
		if (!$his->cars->contains($car)) {
			$this->cars->add($car);
			$car->setContact($this);
		}
	}
}
pak je jedno, jestli budes volat Contact::addCar nebo
Car::setContact. dulezita je ta cast s contains, ta zamezi dalsi
rekurzi

- KristianSubweb
 - Člen | 146
 
David Matějka napsal(a):
nestaci pridat auto do kolekce u
Contact::$cars, dulezita je owning side te relace, coz je v tomhle pripade `Car::$contact, vice v docobecne reseni, aby fungovalo volani z obou stran je neco takoveho:
class Car { ... public function setContact(Contact $contact) { $this->contact = $contact; $contact->addCar($this); } } class Contact { public function addCar(Car $car) { if (!$his->cars->contains($car)) { $this->cars->add($car); $car->setContact($this); } } }pak je jedno, jestli budes volat
Contact::addCarneboCar::setContact. dulezita je ta cast s contains, ta zamezi dalsi rekurzi
Ďakujem super pochopil som a už to fachčíí :)