【问题标题】:Doctrine :: Relation ManyToOne will not workDoctrine :: Relation ManyToOne 将不起作用
【发布时间】:2015-11-25 04:21:28
【问题描述】:

我有一个这样的 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

它总是给我以下错误:

[Doctrine\Common\Annotations\AnnotationException]
[创建错误] 在属性 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;

这是我的多对一:

/**
 * 
 * @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 不存在。

【问题讨论】:

    标签: php zend-framework2 doctrine


    【解决方案1】:

    您的实体字段是映射的反面,因此您必须使用它而不是使用 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 会抛出异常。

    继续:

    多对一关联 =>

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

    EDIT 来自您的回答: 你的映射还是不正确,需要切换 InversedBy 和 mappedBy 中的数据。

    【讨论】:

    • 这种关系是错误的。字段与值在两个方向上都是 OneToOne。 (谢谢你的提示......)
    • 谢谢...我现在明白了。我的失败是选择 ManyToOne,这让我很困惑,因为用例是 OneToone...
    • 链接断开(为什么他们没有重定向叹气)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多