学说:关系多对一是行不通的


Doctrine :: Relation ManyToOne will not work

我有一个这样的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注释]
[创建错误]属性zmpim'Entity'Field::$value上声明的注释@ORM'ManyToOne没有名为"mappedBy"的属性。可用属性:targetEntity, cascade, fetch, inversedBy

都被映射了,…所以这个错误似乎是无意义的


更新:

字段有值和标签。值从BaseValue继承到IntegerValue, StringValue和后来的其他…

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

/** @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'字段到zmpim'Entity'BaseValue的关系中引用的列名称id不存在。

你的实体字段是映射的反面所以你必须使用这个

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

为了更好地理解inversedSide和mapappedby属性,你可以阅读下面的内容:原则逆和拥有方

再次阅读后,你意识到你的两个实体之间的关系问题,但是如果你声明ManyToOne注释,你必须设置inversedBy属性,否则你会得到一个错误。这就是你得到的。你不能声明带有mapappedby属性的ManyToOne注释,因为它不存在,并且会抛出Doctrine异常。

回复:

ManyToOne association =>

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

注意这边需要声明this:

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

OneToMany =>

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

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