我有一个这样的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中的数据需要切换