Doctrine a Nette: Undefined index v UnitOfWork getEntityIdentifier
- ALLSSA
- Člen | 4
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
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);