Doctrine orm 实体类映射无效:彼此不一致

Doctrine orm 实体类映射无效:彼此不一致,doctrine-orm,zend-framework2,Doctrine Orm,Zend Framework2,我有一个表“cms\u objects”//Object.php-它存储所有对象信息 我有另一个表“cms_media”//media.php-它存储所有媒体信息 一个对象可以有多个媒体项(发布许多不同的图像) 在Object.php中 /** * @ORM\OneToMany(targetEntity="Media", mappedBy="Object") */ private $cms_media; 在Media.php中 /** * @ORM\ManyToOne(targetEnt

我有一个表“cms\u objects”//Object.php-它存储所有对象信息 我有另一个表“cms_media”//media.php-它存储所有媒体信息

一个对象可以有多个媒体项(发布许多不同的图像)

在Object.php中

/**
 * @ORM\OneToMany(targetEntity="Media", mappedBy="Object")
 */
private $cms_media;
在Media.php中

/**
 * @ORM\ManyToOne(targetEntity="Object", inversedBy="cms_media")
 * @ORM\JoinColumn(name="object_id", referencedColumnName="id")
 *
 * @Annotation\Exclude()
 */
private $object;
运行时:
php public/index.php orm:validate schema
-我得到:

[Mapping]  FAIL - The entity-class 'Application\Entity\Cms\Media' mapping is invalid:
* The mappings Application\Entity\Cms\Media#object and Application\Entity\Cms\Object#cms_media are inconsistent with each other.


[Mapping]  FAIL - The entity-class 'Application\Entity\Cms\Object' mapping is invalid:
* The association Application\Entity\Cms\Object#cms_media refers to the owning side field Application\Entity\Cms\Media#Object which does not exist.
理想情况下,我需要能够创建一个包含元素“media”或“cms_media”的ZF2表单,但我还无法对其进行验证…

您可以尝试在注释内部使用。而不是

/**
 * @ORM\OneToMany(targetEntity="Media", mappedBy="Object")
 */
试一试

在这两个实体中

此外,我还建议使用camelCased实体属性,而不是带下划线的属性。使用DoctrineObject水合器对具有下划线属性的实体的水合过程存在问题。你可以找到更多的细节

小心-使用不必要的双向关联会增加对象图和域模型的复杂性。尽可能避免双向关联

对于这种情况,如果不需要从媒体Post的反向访问,则可以使用
Post
(对象)和
媒体
实体之间的单向关系重写相同的映射

$media->getPost()

例如
Application/Entity/Cms/Post.php

/** @ORM\Entity **/
class Post
{  
    /**
     * One to many, unidirectional
     * @ORM\ManyToMany(targetEntity="Application\Entity\Cms\Media")
     * @ORM\JoinTable(name="post_to_media",
     *      joinColumns={@ORM\JoinColumn(name="post_id", referencedColumnName="id")},
     *      inverseJoinColumns={
     *      @ORM\JoinColumn(name="media_id", referencedColumnName="id",unique=true)
     *      })
     **/
    private $media;

    public function __construct()
    {
        $this->media = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}
/** @ORM\Entity **/
class Media
{
    // No need to know about post
}
Application/Entity/Cms/Media.php

/** @ORM\Entity **/
class Post
{  
    /**
     * One to many, unidirectional
     * @ORM\ManyToMany(targetEntity="Application\Entity\Cms\Media")
     * @ORM\JoinTable(name="post_to_media",
     *      joinColumns={@ORM\JoinColumn(name="post_id", referencedColumnName="id")},
     *      inverseJoinColumns={
     *      @ORM\JoinColumn(name="media_id", referencedColumnName="id",unique=true)
     *      })
     **/
    private $media;

    public function __construct()
    {
        $this->media = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}
/** @ORM\Entity **/
class Media
{
    // No need to know about post
}

这对我来说很有效:)现在只需更新服务/控制器/视图。。。是的,我不需要知道来自媒体的“帖子”,所以很高兴能像你建议的那样,谢谢!我得到:通过关系“Application\entity\Cms\Object\media”找到了一个新实体,该关系未配置为级联实体:Application\entity\Cms的持久化操作\Media@0000000030c7f5dc000000003546e9e1. 要解决此问题,请对此未知实体显式调用EntityManager#persist(),或在映射中配置cascade persist此关联,例如@manytone(..,cascade={“persist”})。如果找不到导致问题的实体,请执行“Application\entity\Cms\Media\#uuu toString()”以获取线索。我该如何添加媒体?NVM,我让它工作了,必须坚持$Media=new Media();对象