我有一张桌子" 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'但我还没有能够验证它......
答案 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
}