我在Symfony2中的Doctrine2和两个相关实体中遇到问题。
有一个用户实体,可以(不是必须)引用一个包含诸如传记等信息的用户实体。
usermeta是可选的,因为用户是由另一个系统导入的,而usermeta是在我的应用程序中管理的。
当然,我想将两者保存在一起,以便保存用户必须创建或更新用户元实体。
两者都由名为aduserid的列(两个表中的名称相同)连接。
我已经认识到,如果usermeta是可选引用,则在这种情况下的拥有方应为usermeta,否则学说会加载用户并需要usermeta实体-但它并不总是存在的。
请注意User-> setMeta。中的注释。
/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity
*/
class User
{
/**
* @var Usermeta
* @ORM\OneToOne(targetEntity="Usermeta", mappedBy="user", cascade={"persist"})
*/
protected $meta;
public function getMeta()
{
return $this->meta;
}
/**
*
* @param Usermeta $metaValue
*/
public function setMeta($metaValue)
{
// I've tried setting the join-column-value here
// - but it's not getting persisted
// $metaValue->setAduserid($this->getAduserid());
// Then I've tried to set the user-object in Usermeta - but then
// it seems like Doctrine wants to update Usermeta and searches
// for ValId names aduserid (in BasicEntityPersister->_prepareUpdateData)
// but only id is given - so not luck here
// $metaValue->setUser($this);
$this->meta = $metaValue;
}
/**
* @var integer
*
* @ORM\Column(name="rowid", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* Get rowid
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* @var integer
*
* @ORM\Column(name="ADuserid", type="integer", nullable=false)
*/
private $aduserid;
/**
* Set aduserid
*
* @param integer $aduserid
* @return User
*/
public function setAduserid($aduserid)
{
$this->aduserid = $aduserid;
return $this;
}
/**
* Get aduserid
*
* @return integer
*/
public function getAduserid()
{
return $this->aduserid;
}
// some mor fields....
}
和Usermeta类:
/**
* Usermeta
*
* @ORM\Table(name="userMeta")
* @ORM\Entity
*/
class Usermeta
{
/**
* @ORM\OneToOne(targetEntity="User", inversedBy="meta")
* @ORM\JoinColumn(name="ADuserid", referencedColumnName="ADuserid")
*/
protected $user;
public function getUser()
{
return $this->$user;
}
public function setUser($userObj)
{
$this->user = $userObj;
}
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var integer
*
* @ORM\Column(name="ADuserid", type="integer", nullable=false)
*/
private $aduserid;
/**
* Set aduserid
*
* @param integer $aduserid
* @return User
*/
public function setAduserid($aduserid)
{
$this->aduserid = $aduserid;
return $this;
}
/**
* Get aduserid
*
* @return integer
*/
public function getAduserid()
{
return $this->aduserid;
}
}
Controller 代码如下:
...
$userForm->bind($request);
if($userForm->isValid()) {
$em->persist($user);
$em->flush();
}
...
最佳答案
Zdenek Machek的评论几乎是正确的。从Doctrine2文档中可以看到,可为空的选项应位于联接注释(@JoinColumn)中,而不位于映射项(@OneToOne)中。
@JoinColumn文档:
http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#annref-joincolumn
@OneToOne文档:
http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#onetoone
关于symfony - Symfony2 Doctrine2有可选的一对一关系的麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15744323/