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中的数据需要调换一下。
我有一个这样的父类
/** @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 nameid
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中的数据需要调换一下。