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::addCar
neboCar::setContact
. dulezita je ta cast s contains, ta zamezi dalsi rekurzi
Ďakujem super pochopil som a už to fachčíí :)