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

KristianSubweb
Člen | 146
+
0
-

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.

Ondřej Kubíček
Člen | 494
+
+1
-

sorry, ale já nechápu s čím je problém nebo co ti nefunguje ??

KristianSubweb
Člen | 146
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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 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

Ďakujem super pochopil som a už to fachčíí :)