Note that there are some explanatory texts on larger screens.

plurals
  1. PODoctrine Issue; Unable to persist entity if adding items to a relation
    primarykey
    data
    text
    <p>I'm having some difficulty setting up Doctrine and am hoping some guru's can give me a hand. If I try to save a MainEntity on its own, it works fine. However, if I add a "tag" to the tags collection of this entity, I get an error.</p> <p>Here is my info: I have entities that are similar to this</p> <pre><code>namespace CG; class Content { public $id; public $tags; public function __construct() { $this-&gt;tags = new ArrayCollection(); } } /* this is single table inheritance */ class Tag extends TagAssociation { public $id; public $term; public $content; } class Term { public $id; public $name; } </code></pre> <p>Mapping</p> <pre><code>&lt;doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"&gt; &lt;entity name="CG\Content" table="cg_content"&gt; &lt;id name="id" type="integer" column="Id"&gt; &lt;generator strategy="AUTO" /&gt; &lt;/id&gt; &lt;one-to-many field="tags" target-entity="CG\Tag" mapped-by="tagContent"&gt; &lt;join-column name="ContentId" referenced-column-name="Id" nullable="false" fetch="FETCH" /&gt; &lt;cascade&gt; &lt;cascade-persist/&gt; &lt;/cascade&gt; &lt;/one-to-many&gt; &lt;/doctrine-mapping&gt; &lt;doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"&gt; &lt;entity name="CG\Tag" table="cg_contenttags"&gt; &lt;!-- docterin requires bi-directional relationships for many to one --&gt; &lt;many-to-one field="tagContent" target-entity="CG\Content" inversed-by="tags"&gt; &lt;join-column name="ContentId" referenced-column-name="Id" /&gt; &lt;/many-to-one&gt; &lt;/entity&gt; &lt;/doctrine-mapping&gt; &lt;doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"&gt; &lt;entity name="CG\Term" table="cg_tags"&gt; &lt;id name="id" type="integer" column="Id"&gt; &lt;generator strategy="AUTO" /&gt; &lt;/id&gt; &lt;field name="name" column="Name" type="string" /&gt; &lt;/entity&gt; &lt;/doctrine-mapping&gt; &lt;doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"&gt; &lt;entity name="CG\TermAssociation" table="cg_contenttags" inheritance-type="SINGLE_TABLE"&gt; &lt;!-- surrogate PK for simplicity --&gt; &lt;id name="id" type="integer" column="Id"&gt; &lt;generator strategy="AUTO" /&gt; &lt;/id&gt; &lt;discriminator-column name="TaxonomyId" type="integer" /&gt; &lt;discriminator-map&gt; &lt;discriminator-mapping value="1" class="CG\Tag" /&gt; &lt;discriminator-mapping value="2" class="CG\Category" /&gt; &lt;/discriminator-map&gt; &lt;many-to-one field="content" target-entity="CG\Content" &gt; &lt;join-column fetch="FETCH" name="ContentId" referenced-column-name="Id"/&gt; &lt;/many-to-one &gt; &lt;many-to-one field="term" target-entity="CG\Term" &gt; &lt;join-column fetch="FETCH" name="TagId" referenced-column-name="Id" /&gt; &lt;cascade&gt; &lt;cascade-persist/&gt; &lt;/cascade&gt; &lt;/many-to-one &gt; &lt;/entity&gt; &lt;/doctrine-mapping&gt; </code></pre> <p>finally, here are the errors I am getting</p> <pre><code>( ! ) Warning: spl_object_hash() expects parameter 1 to be object, array given in C:\wamp\www\Content\Doctrine\ORM\UnitOfWork.php on line 1073 Call Stack # Time Memory Function Location 1 0.0130 437368 {main}( ) ..\index.php:0 2 0.3809 3813352 CG\handleRequest( ) ..\index.php:181 3 0.3817 3813384 CG\saveContent( ) ..\index.php:92 4 0.4617 6772280 CG\Database-&gt;saveContent( ) ..\index.php:33 5 0.4623 6772872 Doctrine\ORM\EntityManager-&gt;flush( ) ..\Database.php:120 6 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;commit( ) ..\EntityManager.php:334 7 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;computeChangeSets( ) ..\UnitOfWork.php:256 8 0.4669 6932368 Doctrine\ORM\UnitOfWork-&gt;computeChangeSet( ) ..\UnitOfWork.php:510 9 0.4671 6934472 Doctrine\ORM\UnitOfWork-&gt;computeAssociationChanges( ) ..\UnitOfWork.php:495 10 0.4672 6934672 Doctrine\ORM\UnitOfWork-&gt;getEntityState( ) ..\UnitOfWork.php:572 11 0.4672 6934704 spl_object_hash ( ) ..\UnitOfWork.php:1073 ( ! ) Warning: spl_object_hash() expects parameter 1 to be object, array given in C:\wamp\www\Content\Doctrine\ORM\UnitOfWork.php on line 573 Call Stack # Time Memory Function Location 1 0.0130 437368 {main}( ) ..\index.php:0 2 0.3809 3813352 CG\handleRequest( ) ..\index.php:181 3 0.3817 3813384 CG\saveContent( ) ..\index.php:92 4 0.4617 6772280 CG\Database-&gt;saveContent( ) ..\index.php:33 5 0.4623 6772872 Doctrine\ORM\EntityManager-&gt;flush( ) ..\Database.php:120 6 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;commit( ) ..\EntityManager.php:334 7 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;computeChangeSets( ) ..\UnitOfWork.php:256 8 0.4669 6932368 Doctrine\ORM\UnitOfWork-&gt;computeChangeSet( ) ..\UnitOfWork.php:510 9 0.4671 6934472 Doctrine\ORM\UnitOfWork-&gt;computeAssociationChanges( ) ..\UnitOfWork.php:495 10 0.4677 6934704 spl_object_hash ( ) ..\UnitOfWork.php:573 ( ! ) Warning: spl_object_hash() expects parameter 1 to be object, array given in C:\wamp\www\Content\Doctrine\ORM\UnitOfWork.php on line 601 Call Stack # Time Memory Function Location 1 0.0130 437368 {main}( ) ..\index.php:0 2 0.3809 3813352 CG\handleRequest( ) ..\index.php:181 3 0.3817 3813384 CG\saveContent( ) ..\index.php:92 4 0.4617 6772280 CG\Database-&gt;saveContent( ) ..\index.php:33 5 0.4623 6772872 Doctrine\ORM\EntityManager-&gt;flush( ) ..\Database.php:120 6 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;commit( ) ..\EntityManager.php:334 7 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;computeChangeSets( ) ..\UnitOfWork.php:256 8 0.4669 6932368 Doctrine\ORM\UnitOfWork-&gt;computeChangeSet( ) ..\UnitOfWork.php:510 9 0.4671 6934472 Doctrine\ORM\UnitOfWork-&gt;computeAssociationChanges( ) ..\UnitOfWork.php:495 10 0.4680 6934704 Doctrine\ORM\UnitOfWork-&gt;persistNew( ) ..\UnitOfWork.php:583 11 0.4680 6934736 spl_object_hash ( ) ..\UnitOfWork.php:601 ( ! ) Warning: spl_object_hash() expects parameter 1 to be object, array given in C:\wamp\www\Content\Doctrine\ORM\UnitOfWork.php on line 882 Call Stack # Time Memory Function Location 1 0.0130 437368 {main}( ) ..\index.php:0 2 0.3809 3813352 CG\handleRequest( ) ..\index.php:181 3 0.3817 3813384 CG\saveContent( ) ..\index.php:92 4 0.4617 6772280 CG\Database-&gt;saveContent( ) ..\index.php:33 5 0.4623 6772872 Doctrine\ORM\EntityManager-&gt;flush( ) ..\Database.php:120 6 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;commit( ) ..\EntityManager.php:334 7 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;computeChangeSets( ) ..\UnitOfWork.php:256 8 0.4669 6932368 Doctrine\ORM\UnitOfWork-&gt;computeChangeSet( ) ..\UnitOfWork.php:510 9 0.4671 6934472 Doctrine\ORM\UnitOfWork-&gt;computeAssociationChanges( ) ..\UnitOfWork.php:495 10 0.4680 6934704 Doctrine\ORM\UnitOfWork-&gt;persistNew( ) ..\UnitOfWork.php:583 11 0.4685 6934816 Doctrine\ORM\UnitOfWork-&gt;scheduleForInsert( ) ..\UnitOfWork.php:621 12 0.4685 6934848 spl_object_hash ( ) ..\UnitOfWork.php:882 ( ! ) Warning: spl_object_hash() expects parameter 1 to be object, array given in C:\wamp\www\Content\Doctrine\ORM\UnitOfWork.php on line 405 Call Stack # Time Memory Function Location 1 0.0130 437368 {main}( ) ..\index.php:0 2 0.3809 3813352 CG\handleRequest( ) ..\index.php:181 3 0.3817 3813384 CG\saveContent( ) ..\index.php:92 4 0.4617 6772280 CG\Database-&gt;saveContent( ) ..\index.php:33 5 0.4623 6772872 Doctrine\ORM\EntityManager-&gt;flush( ) ..\Database.php:120 6 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;commit( ) ..\EntityManager.php:334 7 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;computeChangeSets( ) ..\UnitOfWork.php:256 8 0.4669 6932368 Doctrine\ORM\UnitOfWork-&gt;computeChangeSet( ) ..\UnitOfWork.php:510 9 0.4671 6934472 Doctrine\ORM\UnitOfWork-&gt;computeAssociationChanges( ) ..\UnitOfWork.php:495 10 0.4689 6935112 Doctrine\ORM\UnitOfWork-&gt;computeChangeSet( ) ..\UnitOfWork.php:584 11 0.4689 6935144 spl_object_hash ( ) ..\UnitOfWork.php:405 ( ! ) Warning: ReflectionProperty::getValue() expects parameter 1 to be object, array given in C:\wamp\www\Content\Doctrine\ORM\UnitOfWork.php on line 408 Call Stack # Time Memory Function Location 1 0.0130 437368 {main}( ) ..\index.php:0 2 0.3809 3813352 CG\handleRequest( ) ..\index.php:181 3 0.3817 3813384 CG\saveContent( ) ..\index.php:92 4 0.4617 6772280 CG\Database-&gt;saveContent( ) ..\index.php:33 5 0.4623 6772872 Doctrine\ORM\EntityManager-&gt;flush( ) ..\Database.php:120 6 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;commit( ) ..\EntityManager.php:334 7 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;computeChangeSets( ) ..\UnitOfWork.php:256 8 0.4669 6932368 Doctrine\ORM\UnitOfWork-&gt;computeChangeSet( ) ..\UnitOfWork.php:510 9 0.4671 6934472 Doctrine\ORM\UnitOfWork-&gt;computeAssociationChanges( ) ..\UnitOfWork.php:495 10 0.4689 6935112 Doctrine\ORM\UnitOfWork-&gt;computeChangeSet( ) ..\UnitOfWork.php:584 11 0.4693 6935344 ReflectionProperty-&gt;getValue( ) ..\UnitOfWork.php:408 ( ! ) Warning: ReflectionProperty::getValue() expects parameter 1 to be object, array given in C:\wamp\www\Content\Doctrine\ORM\UnitOfWork.php on line 408 Call Stack # Time Memory Function Location 1 0.0130 437368 {main}( ) ..\index.php:0 2 0.3809 3813352 CG\handleRequest( ) ..\index.php:181 3 0.3817 3813384 CG\saveContent( ) ..\index.php:92 4 0.4617 6772280 CG\Database-&gt;saveContent( ) ..\index.php:33 5 0.4623 6772872 Doctrine\ORM\EntityManager-&gt;flush( ) ..\Database.php:120 6 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;commit( ) ..\EntityManager.php:334 7 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;computeChangeSets( ) ..\UnitOfWork.php:256 8 0.4669 6932368 Doctrine\ORM\UnitOfWork-&gt;computeChangeSet( ) ..\UnitOfWork.php:510 9 0.4671 6934472 Doctrine\ORM\UnitOfWork-&gt;computeAssociationChanges( ) ..\UnitOfWork.php:495 10 0.4689 6935112 Doctrine\ORM\UnitOfWork-&gt;computeChangeSet( ) ..\UnitOfWork.php:584 11 0.4696 6935424 ReflectionProperty-&gt;getValue( ) ..\UnitOfWork.php:408 ( ! ) Warning: get_class() expects parameter 1 to be object, array given in C:\wamp\www\Content\Doctrine\ORM\UnitOfWork.php on line 839 Call Stack # Time Memory Function Location 1 0.0130 437368 {main}( ) ..\index.php:0 2 0.3809 3813352 CG\handleRequest( ) ..\index.php:181 3 0.3817 3813384 CG\saveContent( ) ..\index.php:92 4 0.4617 6772280 CG\Database-&gt;saveContent( ) ..\index.php:33 5 0.4623 6772872 Doctrine\ORM\EntityManager-&gt;flush( ) ..\Database.php:120 6 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;commit( ) ..\EntityManager.php:334 7 0.4703 6935072 Doctrine\ORM\UnitOfWork-&gt;getCommitOrder( ) ..\UnitOfWork.php:279 8 0.4712 6960832 get_class ( ) ..\UnitOfWork.php:839 ( ! ) Warning: class_parents() [function.class-parents]: object or string expected in C:\wamp\www\Content\Doctrine\ORM\Mapping\ClassMetadataFactory.php on line 223 Call Stack # Time Memory Function Location 1 0.0130 437368 {main}( ) ..\index.php:0 2 0.3809 3813352 CG\handleRequest( ) ..\index.php:181 3 0.3817 3813384 CG\saveContent( ) ..\index.php:92 4 0.4617 6772280 CG\Database-&gt;saveContent( ) ..\index.php:33 5 0.4623 6772872 Doctrine\ORM\EntityManager-&gt;flush( ) ..\Database.php:120 6 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;commit( ) ..\EntityManager.php:334 7 0.4703 6935072 Doctrine\ORM\UnitOfWork-&gt;getCommitOrder( ) ..\UnitOfWork.php:279 8 0.4715 6960784 Doctrine\ORM\EntityManager-&gt;getClassMetadata( ) ..\UnitOfWork.php:841 9 0.4715 6960784 Doctrine\ORM\Mapping\ClassMetadataFactory-&gt;getMetadataFor( ) ..\EntityManager.php:257 10 0.4716 6960816 Doctrine\ORM\Mapping\ClassMetadataFactory-&gt;loadMetadata( ) ..\ClassMetadataFactory.php:170 11 0.4716 6960936 Doctrine\ORM\Mapping\ClassMetadataFactory-&gt;getParentClasses( ) ..\ClassMetadataFactory.php:246 12 0.4716 6961088 class_parents ( ) ..\ClassMetadataFactory.php:223 ( ! ) Warning: array_reverse() expects parameter 1 to be array, boolean given in C:\wamp\www\Content\Doctrine\ORM\Mapping\ClassMetadataFactory.php on line 223 Call Stack # Time Memory Function Location 1 0.0130 437368 {main}( ) ..\index.php:0 2 0.3809 3813352 CG\handleRequest( ) ..\index.php:181 3 0.3817 3813384 CG\saveContent( ) ..\index.php:92 4 0.4617 6772280 CG\Database-&gt;saveContent( ) ..\index.php:33 5 0.4623 6772872 Doctrine\ORM\EntityManager-&gt;flush( ) ..\Database.php:120 6 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;commit( ) ..\EntityManager.php:334 7 0.4703 6935072 Doctrine\ORM\UnitOfWork-&gt;getCommitOrder( ) ..\UnitOfWork.php:279 8 0.4715 6960784 Doctrine\ORM\EntityManager-&gt;getClassMetadata( ) ..\UnitOfWork.php:841 9 0.4715 6960784 Doctrine\ORM\Mapping\ClassMetadataFactory-&gt;getMetadataFor( ) ..\EntityManager.php:257 10 0.4716 6960816 Doctrine\ORM\Mapping\ClassMetadataFactory-&gt;loadMetadata( ) ..\ClassMetadataFactory.php:170 11 0.4716 6960936 Doctrine\ORM\Mapping\ClassMetadataFactory-&gt;getParentClasses( ) ..\ClassMetadataFactory.php:246 12 0.4720 6961448 array_reverse ( ) ..\ClassMetadataFactory.php:223 ( ! ) Warning: Invalid argument supplied for foreach() in C:\wamp\www\Content\Doctrine\ORM\Mapping\ClassMetadataFactory.php on line 223 Call Stack # Time Memory Function Location 1 0.0130 437368 {main}( ) ..\index.php:0 2 0.3809 3813352 CG\handleRequest( ) ..\index.php:181 3 0.3817 3813384 CG\saveContent( ) ..\index.php:92 4 0.4617 6772280 CG\Database-&gt;saveContent( ) ..\index.php:33 5 0.4623 6772872 Doctrine\ORM\EntityManager-&gt;flush( ) ..\Database.php:120 6 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;commit( ) ..\EntityManager.php:334 7 0.4703 6935072 Doctrine\ORM\UnitOfWork-&gt;getCommitOrder( ) ..\UnitOfWork.php:279 8 0.4715 6960784 Doctrine\ORM\EntityManager-&gt;getClassMetadata( ) ..\UnitOfWork.php:841 9 0.4715 6960784 Doctrine\ORM\Mapping\ClassMetadataFactory-&gt;getMetadataFor( ) ..\EntityManager.php:257 10 0.4716 6960816 Doctrine\ORM\Mapping\ClassMetadataFactory-&gt;loadMetadata( ) ..\ClassMetadataFactory.php:170 11 0.4716 6960936 Doctrine\ORM\Mapping\ClassMetadataFactory-&gt;getParentClasses( ) ..\ClassMetadataFactory.php:246 ( ! ) Fatal error: Uncaught exception 'ReflectionException' with message 'Class does not exist' in C:\wamp\www\Content\Doctrine\ORM\Mapping\ClassMetadata.php on line 66 ( ! ) ReflectionException: Class does not exist in C:\wamp\www\Content\Doctrine\ORM\Mapping\ClassMetadata.php on line 66 Call Stack # Time Memory Function Location 1 0.0130 437368 {main}( ) ..\index.php:0 2 0.3809 3813352 CG\handleRequest( ) ..\index.php:181 3 0.3817 3813384 CG\saveContent( ) ..\index.php:92 4 0.4617 6772280 CG\Database-&gt;saveContent( ) ..\index.php:33 5 0.4623 6772872 Doctrine\ORM\EntityManager-&gt;flush( ) ..\Database.php:120 6 0.4623 6772872 Doctrine\ORM\UnitOfWork-&gt;commit( ) ..\EntityManager.php:334 7 0.4703 6935072 Doctrine\ORM\UnitOfWork-&gt;getCommitOrder( ) ..\UnitOfWork.php:279 8 0.4715 6960784 Doctrine\ORM\EntityManager-&gt;getClassMetadata( ) ..\UnitOfWork.php:841 9 0.4715 6960784 Doctrine\ORM\Mapping\ClassMetadataFactory-&gt;getMetadataFor( ) ..\EntityManager.php:257 10 0.4716 6960816 Doctrine\ORM\Mapping\ClassMetadataFactory-&gt;loadMetadata( ) ..\ClassMetadataFactory.php:170 11 0.4727 6971528 Doctrine\ORM\Mapping\ClassMetadataFactory-&gt;newClassMetadataInstance( ) ..\ClassMetadataFactory.php:263 12 0.4728 6973768 Doctrine\ORM\Mapping\ClassMetadata-&gt;__construct( ) ..\ClassMetadataFactory.php:362 13 0.4728 6974008 ReflectionClass-&gt;__construct( ) ..\ClassMetadata.php:66 </code></pre> <p>Edit 1:</p> <p>Here are the lines from my SaveContent function</p> <pre><code>public function saveContent($content) { $this-&gt;entityManager-&gt;persist($content); $this-&gt;entityManager-&gt;flush(); } </code></pre> <p>Save content is pretty easy, however, to create the $content, I am doing the following</p> <ol> <li>receive json that describes changes to the content object</li> <li>check if the json I receive has an id. If so, I get the content object from the database. If not, I create a new content object</li> <li>copy over the fields from the json object to my content object</li> <li>call $content->tags->clear()</li> <li>loop through each of the tags in the json object. These are just strings. I need to recreate $content->tags</li> <li> <ol> <li>See if there is a tag for this contentId and termName in the database. If so, add it to the tags collection. Done.</li> <li>If not, see if there is a term in the database that matches the termName. If so, create a new tag, assign the term and content to it, and add it to tags. Done.</li> <li>if not, create a new tag and a new term, assign the term and content to it, and add it to tags. Done.</li> </ol></li> </ol> <p>Doing a var dump shows that my $content object is as expected.</p> <p><strong>Edit 2: Solved</strong></p> <p><strong>My content object wasn't as expected after all. I had added an array to the tags collection rather than a CG\Tag.</strong></p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload