Doctrine :: Relation ManyToOne不起作用

时间:2015-08-31 07:30:33

标签: php zend-framework2 doctrine

我有一个像这样的ParentClass

/** @ORM\MappedSuperclass */
class BaseValue
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var field
     * @ORM\OneToMany(targetEntity="Field", mappedBy="value", cascade="all")
     */
    protected $field;

    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @param int $id
     */
    public function setId($id)
    {
        $this->id = $id;
    }

    /**
     * @return field
     */
    public function getField()
    {
        return $this->field;
    }

    /**
     * @param field $field
     */
    public function setField($field)
    {
        $this->field = $field;
    }
}

还有这样的孩子

 * @ORM\Entity
 * @ORM\Table(name="integers")
 */
class Integer extends BaseValue
{
    /**
     * @var integer
     *
     * @ORM\Column(name="value", type="integer", nullable=true)
     */
    protected $value;

    /**
     * @return string
     */
    public function getValue()
    {
        return $this->value;
    }

    /**
     * @param string $value
     */
    public function setValue($value)
    {
        $this->value = $value;
    }

}

现在我想把孩子关在另一个类这样的

* @ORM\Entity
 * @ORM\Table(name="fields")
 */
class Field
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var
     * @ORM\ManyToOne(targetEntity="BaseValue", mappedBy="field", cascade="all")
     * @ORM\JoinColumn(name="vid", referencedColumnName="id")
     */
    protected $value; // but it does not work

总是会出现以下错误:

  

[学说\共同\注解\ AnnotationException]
    [Creation Error]在属性zmpim \ Entity \ Field :: $ value上声明的注释@ORM \ ManyToOne没有名为" mappedBy"的属性。可用属性:targetEntity,cascade,fetch,inversedBy

两者都被映射了,所以错误似乎毫无意义

更新

字段包含值和标签。这些值从BaseValue继承到IntegerValue,StringValue和其他后来......

我的OneToMany Relation是父类的继承。 像这样,现在:

/** @ORM\MappedSuperclass */
class BaseValue
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var Field
     * @ORM\OneToMany(targetEntity="Field", mappedBy="field", cascade="persist", orphanRemoval=true )
     */
    protected $field;

这是我的ManyToOne:

/**
 * 
 * @ORM\Entity
 * @ORM\Table(name="fields")
 */
class Field
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var int|null
     * @ORM\ManyToOne(targetEntity="BaseValue", inversedBy="value")
     * @ORM\JoinColumn(name="vid", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $value;

它仍然给我一个错误,但现在是:

  

[学说\ ORM \ ORMException]
        从zmpim \ Entity \ Field到zmpim \ Entity \ BaseValue的关系引用的列名id不存在。

1 个答案:

答案 0 :(得分:3)

您的实体字段是映射的反面,因此您不必使用MappedBy声明,而是必须使用此

 /**
     * Inversed side
     * @var int|null
     * @ORM\ManyToOne(targetEntity="BaseValue", inversedBy="field")
     * @ORM\JoinColumn(name="[your_name]", referencedColumnName="[id]", onDelete="CASCADE")
     */
    protected $value;

要了解inversedSide和MappedBy属性,您可以阅读: Doctrine inverse and owning side

再次阅读之后,您知道两个实体之间的关系问题,但如果您声明ManyToOne注释,则必须设置inversedBy属性,否则您将收到错误。这就是你拥有的。 您不能使用mappedBy属性声明ManyToOne批注,因为它不存在并且由Doctrine抛出异常。

要恢复:

ManyToOne association =>

* @ORM\ManyToOne(targetEntity="[yourEntity]", inversedBy="[Field]")

小心这一方需要声明:

 * @ORM\JoinColumn(name="[your_name]", referencedColumnName="[id]", onDelete="CASCADE")

OneToMany =>

* @ORM\OneToMany(targetEntity="[An_Entity]",
     * mappedBy="[Field]", cascade={"persist"}, orphanRemoval=true)
你回答

编辑: 您的映射仍然不正确,您需要切换InversedBy和mappedBy中的数据。