Symfony2 Doctrine2可选一对一关系的麻烦 [英] Symfony2 Doctrine2 trouble with optional one to one relation

查看:118
本文介绍了Symfony2 Doctrine2可选一对一关系的麻烦的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



有一个用户实体,可以(不一定)有一个usermeta实体被引用,其中包含传记等信息。



usermeta是可选的,因为用户是由另一个系统导入的,而usermeta在我的应用程序中被管理。 p>

当然,我想保存在一起,以便保存用户必须创建或更新usermeta实体。



两者都加入了一个名为aduserid的列(两个表中的同名)。



我已经认识到,如果usermeta是可选参考,在这种情况下拥有方应该是usermeta,否则学说加载用户,需要usermeta实体 - 但并不总是存在。



请注意User-> setMeta ..

中的注释。

  / ** 
*用户
*
* @ ORM\Table(name =user )
* @ ORM\Entity
* /
类用户
{
/ **
* @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)
{
//我已经尝试在这里设置join-column-value
// - 但是没有得到持久化
// $ metaValue-> setAduserid($ this-> ; getAduserid());

//然后我尝试在Usermeta中设置用户对象,但是然后
//似乎Doctrine想要更新Usermeta,并为ValId搜索
//名字aduserid(在BasicEntityPersister-> _prepareUpdateData)
//但只有id被给定 - 所以不幸运
// $ metaValue-> setUser($ this);

$ this-> meta = $ metaValue;
}

/ **
* @var整数
*
* @ ORM\Column(name =rowid,type =integer ,nullable = false)
* @ ORM\Id
* @ ORM\GeneratedValue(strategy =IDENTITY)
* /
private $ id;


/ **
*获取rowid
*
* @return整数
* /
public function getId()
{
return $ this-> id;
}

/ **
* @var整数
*
* @ ORM\Column(name =ADuserid,type =integer ,nullable = false)
* /
private $ aduserid;

/ **
*设置aduserid
*
* @param integer $ aduserid
* @return用户
* /
public function setAduserid($ aduserid)
{
$ this-> aduserid = $ aduserid;

return $ this;
}

/ **
*获取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整数
*
* @ ORM\Column(name =id,type =integer ,nullable = false)
* @ ORM\Id
* @ ORM\GeneratedValue(strategy =IDENTITY)
* /
private $ id;

/ **
* @var整数
*
* @ ORM\Column(name =ADuserid,type =integer,nullable = false )
* /
private $ aduserid;

/ **
*设置aduserid
*
* @param integer $ aduserid
* @return用户
* /
public function setAduserid($ aduserid)
{
$ this-> aduserid = $ aduserid;

return $ this;
}

/ **
*获取aduserid
*
* @return integer
* /
public function getAduserid )
{
return $ this-> aduserid;
}
}

控制器代码如下所示:

  ... 

$ userForm-> bind($ request);

if($ userForm-> isValid()){
$ em-> persist($ user);
$ em-> flush();
}
...


解决方案

阅读我自己的旧问题是非常有趣的,因为我现在看到问题乍一看..



当它来到一个解决方案,我认为这个教义只能处理Ids命名为id,但... aduserid只是没有标记为ID,它缺少Id注释和原则不能使用连接列的字段。



第二件事,Zdenek Machek是对的:它必须被标记为可空。


I have a problem with Doctrine2 in Symfony2 and two relationed entities.

There is a user-entity that can (not must) have a usermeta-entity referenced which contains information like biography etc.

The usermeta is optional because user is imported by another system, while usermeta is managed in my application.

Of course I want to save both together, so that saving a user must create or update a usermeta-entity.

Both are joined by a column named aduserid (same name in both tables).

I've recognized that if usermeta is an optional reference the owning-side in this case should be usermeta, otherwise doctrine loads user and needs the usermeta entity - but it's not always there.

Please note the comments in 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.... 
}

And the Usermeta class:

/**
 * 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;
}
}

the controller code looks like this:

...

$userForm->bind($request);

    if($userForm->isValid()) {
        $em->persist($user);
        $em->flush();
    }
...

解决方案

Reading my own old question is quite fun since I see the problem at first glance now..

When it came to a solution I've thought that doctrine can only handle Ids named "id", but ... aduserid is just not marked as ID, it's missing the Id annotation and doctrine cannot use the fields for the join column..

Second thing, Zdenek Machek was right: It has to be marked as nullable.

这篇关于Symfony2 Doctrine2可选一对一关系的麻烦的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆