26

Symfony2 と 2 つの関連エンティティの Doctrine2 に問題があります。

伝記などの情報を含む usermeta-entity を参照できる(必須ではない) user -entity があります。

usermeta はアプリケーションで管理されていますが、user は別のシステムによってインポートされるため、usermeta はオプションです。

もちろん、両方を一緒に保存したいので、ユーザーを保存するには usermeta-entity を作成または更新する必要があります。

両方が aduserid という名前の列で結合されています (両方のテーブルで同じ名前)。

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

コントローラーのコードは次のようになります。

...

$userForm->bind($request);

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

5 に答える 5

9

問題に対して間違ったタイプの関係を使用しています。

必要なのは、UsermetaからUserへの単方向の 1 対 1です。

双方向の 1 対 1 の関係とは、次のことを意味します。

  1. ユーザーは Usermeta オブジェクトを持っている必要があります。
  2. Usermeta オブジェクトには User が必要です。

あなたの場合、2番目の条件のみを要求しようとしています。

これは、Usermeta からのみ User をハイドレートでき、その逆はできないことを意味します。

残念ながら、doctrineはゼロまたは 1 対多の関係をサポートしていません。

于 2013-04-01T13:31:54.170 に答える
0

この非常に遅い回答を送信して、誰にも迷惑をかけないことを願っていますが、この問題を解決した方法は次のとおりです。

/**
 * @var Takeabyte\GripBundle\Entity\PDF
 * @ORM\OneToOne(targetEntity="Takeabyte\GripBundle\Entity\PDF", inversedBy="element", fetch="EAGER", orphanRemoval=true)
 */
protected $pdf = null;

= null;属性宣言に追加しました。これを読んでくださっている方の参考になれば幸いです。

于 2014-01-07T14:08:43.937 に答える
0

同じことをしようとしているときに、「spl_object_hash() はパラメーター 1 がオブジェクトであり、null が指定されていることを期待しています...」というエラー メッセージが表示されました。One to One逆の値が になる可能性がある一方で、双方向の関係を定義しようとしましたnull。これにより、エラーメッセージが表示されました。関係の逆側を取り除くことで、問題は解決しました。Zero or One to One関係がサポートされていないのは残念です。

于 2013-11-12T16:10:17.013 に答える