Doctrine :: Relation ManyToOne 将不起作用

Doctrine :: Relation ManyToOne will not work

我有一个这样的父类

/** @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;
    }
}

还有像这样的child

 * @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;
    }

}

现在我想在另一个 class 中关联 child 像这样

* @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

它总是给我以下错误:

[Doctrine\Common\Annotations\AnnotationException]
[Creation Error] The annotation @ORM\ManyToOne declared on property zmpim\Entity\Field::$value does not have a property named "mappedBy". Available properties: targetEntity, cascade, fetch, inversedBy

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


更新:

一个字段有值和标签。这些值从 BaseValue 继承到 IntegerValue、StringValue 和后来的其他值...

我的 OneToMany 关系是 parent class 继承。 像这样,现在:

/** @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;

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

[Doctrine\ORM\ORMException]
Column name id referenced for relation from zmpim\Entity\Field towards zmpim\Entity\BaseValue does not exist.

您的实体字段是映射的反面,因此您必须使用此

而不是使用 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 关联 =>

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

注意这边需要声明:

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

一对多 =>

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

编辑 从你的回答: 你的mapping还是不对,你的InversedBy和mappedBy中的数据需要调换一下。