Doctrine a Nette: Undefined index v UnitOfWork getEntityIdentifier

ALLSSA
Člen | 4
+
0
-

Dobrý den,
mohli byste mi prosím poradit s následujícím problémem?

Pokud zavolám

<?php
$baseFacade->addUser($values);
?>

Skončí skript na Notice Undefined index: 0000000067d2c4da00000000526e1d9b. Když jsem se podíval do hloubky, tak je problém v
UnitOfWork.php

<?php
//..
2906:        public function getEntityIdentifier($entity)
2907:        {
2908:            return $this->entityIdentifiers[spl_object_hash($entity)];
2909:        }
//...
?>

Pokračoval jsem tak, že jsem si udělal dump $entityManager->getUnitOfWork()->getScheduledEntityInsertions()

<?php
array (3)
0000000067d2c59300000000526e1d9b => App\RootModule\Models\Event #31dc
0000000067d2c4dd00000000526e1d9b => App\RootModule\Models\User #5582
0000000067d2c4d600000000526e1d9b => Kdyby\GeneratedProxy\__CG__\App\RootModule\Models\Role #e068
?>

Ale problém je, že jsem neměnil entity Role ani User a nevím, proč jsou připravené k vložení do DB. Pokud zakomentuji řádky v CreateEdit->create(), které přídávají uživatele do proměnných changer a creator, tak vše proběhne v pořádku.

Nevíte někdo, čím to může být? Hlavní problém bude zřejmě to, že dostatečně nerozumím Doctrine :)

User.php

<?php
use Doctrine\ORM\Mapping as ORM, App;
use Kdyby\Doctrine\Entities\MagicAccessors;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="root_users")
 */
class User extends \Nette\Object
{

    use \Kdyby\Doctrine\Entities\Attributes\Identifier
    use MagicAccessors;

    /**
     * @ORM\ManyToOne(targetEntity="Role", inversedBy="users", cascade={"persist"})
     * @ORM\joinColumn(name="role_id", referencedColumnName="id")
     */
    private $role;

    /**
     * @ORM\Column(type="string", length=50)
     */
    private $name;

//....

?>

Event.php

<?php
use Doctrine\ORM\Mapping as ORM, App;
use Kdyby\Doctrine\Entities\MagicAccessors;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="root_events")
 */
class Event extends App\Gedulibs\Doctrine\BaseEntity
{
    use App\Gedulibs\Doctrine\Attributes\Identifier;
	use MagicAccessors;
	use App\..\CreateEdit;


    /**
     * @ORM\Column(type="string", length=100)
     */
    private $name;

//....

?>

CreateEdit.php

<?php
	use Doctrine\ORM\Mapping as ORM;
	use Nette\Utils\DateTime;

	trait CreateEdit
	{
		/**
		* @ORM\Column(type="datetime", nullable = true)
		* @var DateTime
		*/
		private $created;

		/**
		 * @ORM\ManyToOne(targetEntity="App\RootModule\Models\User", cascade={"persist"})
		 * @ORM\joinColumn(name="creator_id", referencedColumnName="id")
		 */
		private $creator;

		/**
		 * @ORM\Column(type="datetime", nullable = true)
		 * @var DateTime
		 */
		private $changed;

		/**
		 * @ORM\ManyToOne(targetEntity="App\RootModule\Models\User")
		 * @ORM\joinColumn(name="changer_id", referencedColumnName="id")
		 */
		private $changer;

		public function change($loggedUser){
            $this->changed = new DateTime();
            $this->changer = $loggedUser;
            return $this;
        }

        public function create($loggedUser){
			$this->changed = new DateTime();
            $this->changer = $loggedUser;//pokud toto zakomentuju, tak vše proběhne jak má - viz text nahoře
            $this->created = new DateTime();
            $this->creator = $loggedUser;//pokud toto zakomentuju, tak vše proběhne jak má - viz text nahoře
            return $this;
        }
?>

EventFacade.php

<?php
//...
		public function addEvent($values)
		{
			$event = new Event();
			$event->setName($values['name']);
            //..

            $event->create($this->loggedUser);
			// $this->loggedUser je entita User. Je načítán ze session, která se tvoří při přihlášení.

            $this->persist($event);
            $this->flush();

            return $event;
		}
//...
?>
WellBloud
Člen | 5
+
0
-

Měl jsem podobný problém. U mě to bylo tím, že jsem po dávkách zpracovával import produktů, kde jsem volal $entityManager->clear();.
Tím se detacheovaly všechny entity, takže v dalším průchodu chyběla entita usera. Vyřešil jsem to přepsáním na $entityManager->clear(ProductEntity::class);