原则问题;如果向关系添加项,则无法持久化实体


Doctrine Issue; Unable to persist entity if adding items to a relation

我在设置Doctrine时遇到了一些困难,我希望一些大师能帮我一把。如果我尝试保存一个MainEntity自己,它工作得很好。但是,如果我在这个实体的标签集合中添加一个"tag",就会得到一个错误。

这是我的信息:我有实体类似于这个

namespace CG;
class Content
{
    public $id;
    public $tags;
    public function __construct()
    {
        $this->tags = new ArrayCollection();
    } 
}
/* this is single table inheritance */
class Tag extends TagAssociation
{
    public $id;
    public $term;
    public $content;
}
class Term
{
    public $id;
    public $name;
}

映射
<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">
      <entity name="CG'Content" table="cg_content">
          <id name="id" type="integer" column="Id">
              <generator strategy="AUTO" />
          </id>
            <one-to-many field="tags" target-entity="CG'Tag" mapped-by="tagContent">
                 <join-column name="ContentId" referenced-column-name="Id" nullable="false"  fetch="FETCH" />
                <cascade>
                    <cascade-persist/>
                </cascade>
            </one-to-many>
</doctrine-mapping> 
<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">
      <entity name="CG'Tag" table="cg_contenttags">
            <!-- docterin requires bi-directional relationships for many to one -->
            <many-to-one field="tagContent" target-entity="CG'Content" inversed-by="tags">
                <join-column name="ContentId" referenced-column-name="Id" />
            </many-to-one>
      </entity>
</doctrine-mapping>
<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">
      <entity name="CG'Term" table="cg_tags">
          <id name="id" type="integer" column="Id">
              <generator strategy="AUTO" />
          </id>
          <field name="name" column="Name" type="string" />
      </entity>
</doctrine-mapping> 
<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">
      <entity name="CG'TermAssociation" table="cg_contenttags"  inheritance-type="SINGLE_TABLE">
             <!-- surrogate PK for simplicity -->
             <id name="id" type="integer" column="Id">
                  <generator strategy="AUTO" />
              </id>
            <discriminator-column name="TaxonomyId" type="integer" />
            <discriminator-map>
                <discriminator-mapping value="1" class="CG'Tag" />
                <discriminator-mapping value="2" class="CG'Category" />
            </discriminator-map>

            <many-to-one field="content" target-entity="CG'Content" >
                <join-column  fetch="FETCH" name="ContentId" referenced-column-name="Id"/>
            </many-to-one >

            <many-to-one field="term" target-entity="CG'Term" >
                <join-column  fetch="FETCH" name="TagId" referenced-column-name="Id" />
                <cascade>
                    <cascade-persist/>
                </cascade>
            </many-to-one >
      </entity>
</doctrine-mapping>

最后,这里是我得到的错误

( ! ) 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->saveContent( ) ..'index.php:33
5   0.4623  6772872 Doctrine'ORM'EntityManager->flush( )    ..'Database.php:120
6   0.4623  6772872 Doctrine'ORM'UnitOfWork->commit( )  ..'EntityManager.php:334
7   0.4623  6772872 Doctrine'ORM'UnitOfWork->computeChangeSets( )   ..'UnitOfWork.php:256
8   0.4669  6932368 Doctrine'ORM'UnitOfWork->computeChangeSet( )    ..'UnitOfWork.php:510
9   0.4671  6934472 Doctrine'ORM'UnitOfWork->computeAssociationChanges( )   ..'UnitOfWork.php:495
10  0.4672  6934672 Doctrine'ORM'UnitOfWork->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->saveContent( ) ..'index.php:33
5   0.4623  6772872 Doctrine'ORM'EntityManager->flush( )    ..'Database.php:120
6   0.4623  6772872 Doctrine'ORM'UnitOfWork->commit( )  ..'EntityManager.php:334
7   0.4623  6772872 Doctrine'ORM'UnitOfWork->computeChangeSets( )   ..'UnitOfWork.php:256
8   0.4669  6932368 Doctrine'ORM'UnitOfWork->computeChangeSet( )    ..'UnitOfWork.php:510
9   0.4671  6934472 Doctrine'ORM'UnitOfWork->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->saveContent( ) ..'index.php:33
5   0.4623  6772872 Doctrine'ORM'EntityManager->flush( )    ..'Database.php:120
6   0.4623  6772872 Doctrine'ORM'UnitOfWork->commit( )  ..'EntityManager.php:334
7   0.4623  6772872 Doctrine'ORM'UnitOfWork->computeChangeSets( )   ..'UnitOfWork.php:256
8   0.4669  6932368 Doctrine'ORM'UnitOfWork->computeChangeSet( )    ..'UnitOfWork.php:510
9   0.4671  6934472 Doctrine'ORM'UnitOfWork->computeAssociationChanges( )   ..'UnitOfWork.php:495
10  0.4680  6934704 Doctrine'ORM'UnitOfWork->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->saveContent( ) ..'index.php:33
5   0.4623  6772872 Doctrine'ORM'EntityManager->flush( )    ..'Database.php:120
6   0.4623  6772872 Doctrine'ORM'UnitOfWork->commit( )  ..'EntityManager.php:334
7   0.4623  6772872 Doctrine'ORM'UnitOfWork->computeChangeSets( )   ..'UnitOfWork.php:256
8   0.4669  6932368 Doctrine'ORM'UnitOfWork->computeChangeSet( )    ..'UnitOfWork.php:510
9   0.4671  6934472 Doctrine'ORM'UnitOfWork->computeAssociationChanges( )   ..'UnitOfWork.php:495
10  0.4680  6934704 Doctrine'ORM'UnitOfWork->persistNew( )  ..'UnitOfWork.php:583
11  0.4685  6934816 Doctrine'ORM'UnitOfWork->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->saveContent( ) ..'index.php:33
5   0.4623  6772872 Doctrine'ORM'EntityManager->flush( )    ..'Database.php:120
6   0.4623  6772872 Doctrine'ORM'UnitOfWork->commit( )  ..'EntityManager.php:334
7   0.4623  6772872 Doctrine'ORM'UnitOfWork->computeChangeSets( )   ..'UnitOfWork.php:256
8   0.4669  6932368 Doctrine'ORM'UnitOfWork->computeChangeSet( )    ..'UnitOfWork.php:510
9   0.4671  6934472 Doctrine'ORM'UnitOfWork->computeAssociationChanges( )   ..'UnitOfWork.php:495
10  0.4689  6935112 Doctrine'ORM'UnitOfWork->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->saveContent( ) ..'index.php:33
5   0.4623  6772872 Doctrine'ORM'EntityManager->flush( )    ..'Database.php:120
6   0.4623  6772872 Doctrine'ORM'UnitOfWork->commit( )  ..'EntityManager.php:334
7   0.4623  6772872 Doctrine'ORM'UnitOfWork->computeChangeSets( )   ..'UnitOfWork.php:256
8   0.4669  6932368 Doctrine'ORM'UnitOfWork->computeChangeSet( )    ..'UnitOfWork.php:510
9   0.4671  6934472 Doctrine'ORM'UnitOfWork->computeAssociationChanges( )   ..'UnitOfWork.php:495
10  0.4689  6935112 Doctrine'ORM'UnitOfWork->computeChangeSet( )    ..'UnitOfWork.php:584
11  0.4693  6935344 ReflectionProperty->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->saveContent( ) ..'index.php:33
5   0.4623  6772872 Doctrine'ORM'EntityManager->flush( )    ..'Database.php:120
6   0.4623  6772872 Doctrine'ORM'UnitOfWork->commit( )  ..'EntityManager.php:334
7   0.4623  6772872 Doctrine'ORM'UnitOfWork->computeChangeSets( )   ..'UnitOfWork.php:256
8   0.4669  6932368 Doctrine'ORM'UnitOfWork->computeChangeSet( )    ..'UnitOfWork.php:510
9   0.4671  6934472 Doctrine'ORM'UnitOfWork->computeAssociationChanges( )   ..'UnitOfWork.php:495
10  0.4689  6935112 Doctrine'ORM'UnitOfWork->computeChangeSet( )    ..'UnitOfWork.php:584
11  0.4696  6935424 ReflectionProperty->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->saveContent( ) ..'index.php:33
5   0.4623  6772872 Doctrine'ORM'EntityManager->flush( )    ..'Database.php:120
6   0.4623  6772872 Doctrine'ORM'UnitOfWork->commit( )  ..'EntityManager.php:334
7   0.4703  6935072 Doctrine'ORM'UnitOfWork->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->saveContent( ) ..'index.php:33
5   0.4623  6772872 Doctrine'ORM'EntityManager->flush( )    ..'Database.php:120
6   0.4623  6772872 Doctrine'ORM'UnitOfWork->commit( )  ..'EntityManager.php:334
7   0.4703  6935072 Doctrine'ORM'UnitOfWork->getCommitOrder( )  ..'UnitOfWork.php:279
8   0.4715  6960784 Doctrine'ORM'EntityManager->getClassMetadata( ) ..'UnitOfWork.php:841
9   0.4715  6960784 Doctrine'ORM'Mapping'ClassMetadataFactory->getMetadataFor( )    ..'EntityManager.php:257
10  0.4716  6960816 Doctrine'ORM'Mapping'ClassMetadataFactory->loadMetadata( )  ..'ClassMetadataFactory.php:170
11  0.4716  6960936 Doctrine'ORM'Mapping'ClassMetadataFactory->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->saveContent( ) ..'index.php:33
5   0.4623  6772872 Doctrine'ORM'EntityManager->flush( )    ..'Database.php:120
6   0.4623  6772872 Doctrine'ORM'UnitOfWork->commit( )  ..'EntityManager.php:334
7   0.4703  6935072 Doctrine'ORM'UnitOfWork->getCommitOrder( )  ..'UnitOfWork.php:279
8   0.4715  6960784 Doctrine'ORM'EntityManager->getClassMetadata( ) ..'UnitOfWork.php:841
9   0.4715  6960784 Doctrine'ORM'Mapping'ClassMetadataFactory->getMetadataFor( )    ..'EntityManager.php:257
10  0.4716  6960816 Doctrine'ORM'Mapping'ClassMetadataFactory->loadMetadata( )  ..'ClassMetadataFactory.php:170
11  0.4716  6960936 Doctrine'ORM'Mapping'ClassMetadataFactory->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->saveContent( ) ..'index.php:33
5   0.4623  6772872 Doctrine'ORM'EntityManager->flush( )    ..'Database.php:120
6   0.4623  6772872 Doctrine'ORM'UnitOfWork->commit( )  ..'EntityManager.php:334
7   0.4703  6935072 Doctrine'ORM'UnitOfWork->getCommitOrder( )  ..'UnitOfWork.php:279
8   0.4715  6960784 Doctrine'ORM'EntityManager->getClassMetadata( ) ..'UnitOfWork.php:841
9   0.4715  6960784 Doctrine'ORM'Mapping'ClassMetadataFactory->getMetadataFor( )    ..'EntityManager.php:257
10  0.4716  6960816 Doctrine'ORM'Mapping'ClassMetadataFactory->loadMetadata( )  ..'ClassMetadataFactory.php:170
11  0.4716  6960936 Doctrine'ORM'Mapping'ClassMetadataFactory->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->saveContent( ) ..'index.php:33
5   0.4623  6772872 Doctrine'ORM'EntityManager->flush( )    ..'Database.php:120
6   0.4623  6772872 Doctrine'ORM'UnitOfWork->commit( )  ..'EntityManager.php:334
7   0.4703  6935072 Doctrine'ORM'UnitOfWork->getCommitOrder( )  ..'UnitOfWork.php:279
8   0.4715  6960784 Doctrine'ORM'EntityManager->getClassMetadata( ) ..'UnitOfWork.php:841
9   0.4715  6960784 Doctrine'ORM'Mapping'ClassMetadataFactory->getMetadataFor( )    ..'EntityManager.php:257
10  0.4716  6960816 Doctrine'ORM'Mapping'ClassMetadataFactory->loadMetadata( )  ..'ClassMetadataFactory.php:170
11  0.4727  6971528 Doctrine'ORM'Mapping'ClassMetadataFactory->newClassMetadataInstance( )  ..'ClassMetadataFactory.php:263
12  0.4728  6973768 Doctrine'ORM'Mapping'ClassMetadata->__construct( )  ..'ClassMetadataFactory.php:362
13  0.4728  6974008 ReflectionClass->__construct( ) ..'ClassMetadata.php:66
编辑1:

下面是我的SaveContent函数

中的行
public function saveContent($content)
    {
        $this->entityManager->persist($content);
        $this->entityManager->flush();
    }

保存内容非常简单,但是,要创建$content,我正在做以下操作

  1. 接收描述内容对象更改的json
  2. 检查我收到的json是否有id。如果是,则从数据库获取内容对象。如果没有,我创建一个新的内容对象
  3. 将json对象中的字段复制到我的内容对象
  4. 调用内容- ->>标记清楚()
  5. 循环遍历json对象中的每个标签。这些只是字符串。我需要重新创建$content->tags
    1. 查看数据库中是否有这个contentId和termName的标签。如果是,将其添加到标记集合中。做。
    2. 如果没有,查看数据库中是否有与termName匹配的术语。如果是,则创建一个新标记,为其分配术语和内容,并将其添加到标记中。做。
    3. 如果没有
    4. ,则创建新标签和新术语,为其分配术语和内容,并将其添加到标签中。做。

执行var转储显示我的$content对象是预期的。

Edit 2: Solved

我的内容对象终究不是预期的那样。我在标签集合中添加了一个数组,而不是CG'Tag。

回答这个问题就结束了。如果有人有同样的问题,也许这能帮到你。

我的内容对象终究不是预期的那样。我在标签集合中添加了一个数组,而不是CG'Tag。这导致集合不是Doctrine所期望的,因此警告

警告:spl_object_hash()期望参数1为object, array鉴于

一个小提示:注意addTag方法和setTag方法的区别。

<?php
class Article
{
    /**
     * @var Tags
     *
     * @ORM'ManyToMany(targetEntity="Tags", inversedBy="article", cascade={"all"})
     * @ORM'JoinTable(name="article_tags",
     *   joinColumns={
     *     @ORM'JoinColumn(name="article_id", referencedColumnName="id")
     *   },
     *   inverseJoinColumns={
     *     @ORM'JoinColumn(name="tag_id", referencedColumnName="id")
     *   }
     * )
     */
    private $tag;
    public function __construct()
    {
        $this->tag = new 'Doctrine'Common'Collections'ArrayCollection();
    }
    public function addTag('Acme'CoreBundle'Entity'Tag $tag)
    {
        $this->tag[] = $tag;
    }
    // the set method is useful to automatic form purposes
    public function setTag('Doctrine'Common'Collections'ArrayCollection $tag)
    {
        $this->tag = $tag;
    }
}
?>

我有完全相同的问题-也是与标签(许多标签相关的许多文章在DB)。

我得到了下面的指令:

                    foreach ($tags as $vv) {
                        $tobj = $this->getDoctrine()
                            ->getRepository("MainBundle:Tag")
                                ->findByTag($vv); // returns ARRAY of objects (= not wanted and not expected by Doctrine)
                        //...
                        $artic->getTags()->add($tobj);

正常工作的代码是:

                    foreach ($tags as $vv) {
                        $tobj = $this->getDoctrine()
                            ->getRepository("MainBundle:Tag")
                                ->findOneByTag($vv); // returns one object
                        //...
                        $artic->getTags()->add($tobj);

(注意findONEby,而不是findby)