我有一个像这样的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
不存在。
答案 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中的数据。