Tôi gặp vấn đề với Doctrine2 trong Symfony2 và hai thực thể có quan hệ.Symfony2 Doctrine2 gặp rắc rối với mối quan hệ một đến một tùy chọn
Có một người dùng thực thể mà thể (không phải) có một usermeta thực thể tham chiếu chứa các thông tin như tiểu sử, vv
Các usermeta là không bắt buộc vì sử dụng được nhập khẩu bởi một hệ thống khác, trong khi usermeta là được quản lý trong ứng dụng của tôi.
Tất nhiên tôi muốn lưu cả hai cùng nhau, để lưu người dùng phải tạo hoặc cập nhật thực thể usermeta.
Cả hai đều được nối với nhau bằng một cột có tên aduserid (cùng tên trong cả hai bảng).
Tôi đã nhận ra rằng nếu usermeta là tham chiếu tùy chọn, trường hợp sở hữu trong trường hợp này phải là usermeta, nếu không học thuyết sẽ tải người dùng và cần thực thể usermeta - nhưng không phải lúc nào cũng ở đó.
Xin lưu ý các ý kiến trong 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....
}
Và lớp 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;
}
}
mã điều khiển trông như thế này:
...
$userForm->bind($request);
if($userForm->isValid()) {
$em->persist($user);
$em->flush();
}
...
Không phải là lừa để cài đặt meta - nullable = true /** * @var Usermeta * @ORM \ OneToOne (targetEntity = "Usermeta", mappedBy = "user" , cascade = {"persist"}, nullable = true) */ được bảo vệ $ meta; –
@Zdenek, chú thích OneToOne không có tham số nullable. Nó là tham số của '@ JoinColumn'. – Athlan