Doctrine 2 hydrácia (naplnenie a prepísanie) existujúcej entity z Nette\Forms

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
iNviNho
Člen | 352
+
0
-

Ahojte,

Mám entitu Contact. Pri hydrácií tejto entity z hodnot formulára všetko prebehne v poriadku ak dodám entitu ako new…

<?php
$v = $form->getValues(TRUE);
$this->hydratorService->fromArray($v, new \App\Entities\Contact);
?>

Akonáhle chcem použiť hydrátor na už existujúcu entitu Contact

<?php
$contact = $this->hydratorService->fromArray($v, $this->contactService->getById($v["contact_id"]));
?>

..tak dostávam error

Warning

Illegal offset type in isset or empty

Tento error vzniká určite kvôli asociáciám, ktoré entita Contact obsahuje, napr. mails pri vytvorení entity sú ArrayCollection, ale ak ju vrátim z DB, tak už obsahuje PersistentCollection a tam podľa mňa nastáva problém a hydrácia zlyháva

<?php
/**
 * @ORM\Entity
 */
class Contact extends \Nette\Object {

    use \Kdyby\Doctrine\Entities\MagicAccessors;

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;

	/** ...... */

    /**
     * @ORM\ManyToMany(targetEntity="E_mail", inversedBy="contacts", cascade={"persist"})
     * @ORM\JoinTable(name="contact_e_mail")
     */
    protected $mails;

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

?>

Čiže moja otázka by bola, či je možné nejako už načítanú entitu zmeniť na to, aby obsahovala namiesto PeristentCollectionArrayCollection. Napadá ma toto, ale neviem, nie je to moc sexy

<?php
// EDIT ani toto nefunguje ...
$contact->setMails($contact->getMails()->getValues());
?>

Editoval iNviNho (29. 1. 2016 13:06)

artemevsin
Člen | 61
+
0
-

ukaž jak vypadá hydratorService::fromArray

Editoval artemevsin (29. 1. 2016 14:08)

iNviNho
Člen | 352
+
0
-

artemevsin napsal(a):

ukaž jak vypadá hydratorService::fromArray

<?php
use DoctrineModule\Stdlib\Hydrator\DoctrineObject as Hydrator;

/**
     * @var Hydrator
     */
    public $hydrator;

    public function __construct(\Kdyby\Doctrine\EntityManager $em) {
        $this->hydrator = new Hydrator($em);
    }

$this->hydrator->hydrate($data, $entity);

?>
akadlec
Člen | 1326
+
0
-

Tipuju že prostě hydrátor se tím neumí poprat, tak se obrátit na autora?

iNviNho
Člen | 352
+
0
-

akadlec napsal(a):

Tipuju že prostě hydrátor se tím neumí poprat, tak se obrátit na autora?

áno to si myslím, nemáš náhodou nápad ako inakšie sa to dá elegantne spraviť?:)

akadlec
Člen | 1326
+
0
-

Já si napsal vlastní mapper co vyhovuje mým potřebám, jednoduše potřebuju pole formuláře namapovat na entitu

iNviNho
Člen | 352
+
0
-

Ďakujem,

to bude tá správna cesta. Skúsim to zajtra ráno a uvidíme, na čo prídem :)

akadlec napsal(a):

Já si napsal vlastní mapper co vyhovuje mým potřebám, jednoduše potřebuju pole formuláře namapovat na entitu