dal*_*luq 23 orm one-to-one symfony doctrine-orm
我在Symfony2和两个关联实体中遇到了Doctrine2的问题.
有一个用户实体可以(不一定)有一个引用的usermeta实体,其中包含传记等信息.
usermeta是可选的,因为用户是由另一个系统导入的,而usermeta是在我的应用程序中管理的.
当然我想将两者保存在一起,以便保存用户必须创建或更新usermeta-entity.
两者都由名为aduserid的列连接(两个表中的名称相同).
我已经认识到,如果usermeta是一个可选引用,在这种情况下,拥有方应该是usermeta,否则doctrine会加载用户并需要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....
}
Run Code Online (Sandbox Code Playgroud)
和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;
}
}
Run Code Online (Sandbox Code Playgroud)
控制器代码如下所示:
...
$userForm->bind($request);
if($userForm->isValid()) {
$em->persist($user);
$em->flush();
}
...
Run Code Online (Sandbox Code Playgroud)
Fra*_*ula 17
该兹德涅克Machek评论几乎是正确的.从Doctrine2文档中可以看出,nullable选项应该在连接注释(@JoinColumn)中,而不是在映射中(@OneToOne).
@JoinColumn doc:
此注释用于@ManyToOne,@ OneToOne字段和嵌套在@ManyToMany中的@JoinTable的上下文中的关系的上下文中.此注释不是必需的.如果未指定,则从表和主键名称推断出属性name和referencedColumnName.
必需属性:
name:包含此关系的外键标识符的列名.在@JoinTable的上下文中,它指定了连接表中的列名.
referencedColumnName:用于连接此关系的主键标识符的名称.
可选属性:
unique:确定此关系是否在受影响的实体之间是独占的,并且应该在数据库约束级别上强制执行.默认为false.
nullable:确定相关实体是否是必需的,或者null是否为关系的允许状态.默认为true.
onDelete:级联动作(数据库级)
onUpdate:级联操作(数据库级)
columnDefinition:在列名后面开始并指定完整(非可移植!)列定义的DDL SQL片段.此属性允许使用高级RMDBS功能.如果您需要稍微不同的列定义来连接列,则必须在@JoinColumn上使用此属性,例如关于NULL/NOT NULL默认值.但是,默认情况下,@ Column上的"columnDefinition"属性也会设置相关的@ JoinColumn的columnDefinition.这是使外键工作所必需的.
http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#annref-joincolumn
@OneToOne doc:
@OneToOne注释几乎与@ManyToOne完全相同,并且可以指定一个附加选项.@JoinColumn的配置默认使用目标实体表,主键列名也适用于此处.
必需属性:
targetEntity:引用的目标实体的FQCN.如果两个类都在同一名称空间中,则可以是非限定类名.重要提示:没有领先的反斜杠!
可选属性:
级联:级联选项
获取:LAZY或EAGER之一
orphanRemoval:Boolean,指定是否应该通过Doctrine删除孤立,未连接到任何拥有实例的反向OneToOne实体.默认为false.
inversedBy:inversedBy属性指定实体中的场,该场是关系的反面.
http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#onetoone
dal*_*luq -5
阅读我自己的旧问题非常有趣,因为我现在第一眼就看到了这个问题。
当谈到解决方案时,我认为原则只能处理名为“id”的 Id,但是...aduserid 只是没有标记为 ID,它缺少 Id 注释,并且原则无法使用连接列的字段。
第二件事,Zdenek Machek 是对的:它必须被标记为可为空。
| 归档时间: |
|
| 查看次数: |
32251 次 |
| 最近记录: |