2016-07-17 12 views
1

geplant werden, ich habe die folgenden Klassen bekam (nur partials zeigen Menge zu reduzieren, zu lesen)Doctrine2 ORM - Ein verwaltetes + schmutzig Einheit X kann nicht zum Einfügen

class Page { 
    /** 
    * @ORM\Column(type="string", unique=true, nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="UUID") 
    * @var string 
    */ 
    protected $id; 
    /** 
    * @ORM\OneToMany(targetEntity="Url", mappedBy="content") 
    * @var Url[] 
    */ 
    protected $urls; 

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

Und:

class Url 
{ 
    /** 
    * @ORM\Id @ORM\Column(type="string", unique=true, nullable=false) 
    * @ORM\GeneratedValue(strategy="UUID") 
    * @var string The unique identifier for the Url 
    */ 
    protected $id; 
    /** 
    * @ORM\ManyToOne(targetEntity="Page", inversedBy="urls", cascade={"persist", "merge"}) 
    * @ORM\JoinColumn(name="content_id", referencedColumnName="id") 
    * @var int The UUID of the content 
    */ 
    protected $content; 

    public function __construct(Page $content, $link) 
    { 
     $this->content = $content; 
     $this->content->addUrl($this); 
    } 
} 

Jede von diesen hat eine Manager-Klasse mit einer save()-Funktion, die nur persist() und flush() verwendet. sie Speichern wird dann durchgeführt, wie:

$pageManager->save($post); 
$url = new Url($post, 'link goes here'); 
$urlManager->save($url); 

ich auch versucht habe:

$url = new Url($post, 'link goes here'); 
$pageManager->save($post); 
$urlManager->save($url); 

Obwohl in beiden Fällen erhalte ich: (!)

Fatal error: Uncaught Ausnahme ‚Doktrin \ ORM \ ORMInvalidArgumentException 'with message' Eine verwaltete + unreine Entität Seite @ 000000003d5a4ca10000000133ba3c3e kann nicht zum Einfügen eingeplant werden. '

Ich habe dies versucht, sowohl mit als auch ohne AnnotationReader mit EntityManager::create() mit verwendet werden

Lehre Schema-Validator keine Fehler berichten entweder:

php vendor/bin/doctrine orm:validate-schema 
[Mapping] OK - The mapping files are correct. 
[Database] OK - The database schema is in sync with the mapping files. 

Irgendwelche Ideen, wie man die persist() an die Arbeit ?

Antwort

0

es herausgefunden:

ich die Reihenfolge, wie sie in, so wird die Url gespeichert zuerst, und dann Page gespeichert wurden rückgängig hatte (obwohl dabei es ein weiteres Problem eröffnet, das ich lösen müssen, wo es will der Autor Einheit bestehen bleiben kann, aber nicht (es denkt, dass es neu ist, aber es ist nicht). dachte, vielleicht wurde es abgelöst, sondern auch ein merge() es nicht lösen.

/** 
* @ORM\ManyToOne(targetEntity="User") 
* @ORM\JoinColumn(name="author_id", referencedColumnName="id") 
* @var string The UUID of the author for the {@link Page} 
*/ 
protected $author; 
0

Sie müssen die $ post anhalten und Die $ url-Objekte vor dem Flush. Andernfalls werden Sie diese Fehlermeldung haben.

Versuchen, dies zu tun ...

$entityManager->persist($post); 
$url = new Url($post, 'link goes here'); 
$entityManager->persist($url); 
$entityManager->flush(); 

Oder Sie einen Flag param auf Ihrem Manager erstellen können, Flush nicht, wenn falsch ...

$flush = false; 
$pageManager->save($post, $flush); 
$url = new Url($post, 'link goes here'); 
$urlManager->save($url); 

Wahrscheinlich ohne zusätzliche arbeiten Ressourcen.