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

时间:2014-08-05 06:58:26

标签: doctrine-orm zend-framework2

我有一张桌子" cms_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.

理想情况下,我需要能够使用元素创建ZF2表单:' media'或者' cms_media'但我还没有能够验证它......

1 个答案:

答案 0 :(得分:1)

您可以尝试在注释中使用FQCN。而不是

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

/**
 * @ORM\OneToMany(targetEntity="Application\Entity\Cms\Media", mappedBy="Object")
 */

在两个实体中。

此外,我还建议使用 camelCased 实体属性,而不是 underscored_ones 。使用DoctrineObject水化器的具有强调属性的实体的水合过程是有问题的。您可以找到更多详细信息here

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

对于这种情况,如果您不需要媒体Post(对象)和Media实体之间的单向关系重写相同的映射> 发布,如

$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();
    }

    // ...
}

Application/Entity/Cms/Media.php

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