我在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/

10-10 13:47