2017-04-27 26 views
0

DoctrineとのSymfony 3では、同じ主キーを共有している両方のテーブルで1対1の一方向関係を取得しようとしています。これを行うには、例をDoctrine Association Mappingページに複製しようとしています。Doctrine 1対1一方向

しかし、1対1のドキュメントにはセッターとゲッターの例はなく、ターゲットエンティティのidフィールドの定義もありません。そこで私は自分の周りを実験しようとしました。

これらは私の実体である:私は国のエンティティを永続化すると

class Country 
{ 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", precision=0, scale=0, nullable=false, unique=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @ORM\OneToOne(targetEntity="MySubEntity", cascade={"persist", "remove"}) 
    * @ORM\JoinColumn(name="id", referencedColumnName="id", nullable=true) 
    */ 
    private $mysubentity; 
    [...] 
    /** 
    * @return MySubEntity 
    */ 
    public function getMySubEntity() 
    { 
     return $this->mysubentity; 
    } 

    /** 
    * @param MySubEntity $mysubentity 
    */ 
    public function setMySubEntity($mysubentity) 
    { 
     $this->mysubentity = $mysubentity; 
    } 
} 

class MySubEntity 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", precision=0, scale=0, nullable=false, unique=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    [..] 

    /** 
    * Set id 
    * 
    * @param $id 
    * 
    * @return MySubEntity 
    */ 
    public function setId($id) 
    { 
     $this->id = $id; 

     return $this; 
    } 

    /** 
    * Get id 
    * 
    * @return int 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
} 

は、私がIntegrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint failsを受けます。データを調べると、DoctrineはMySubEntityのIDを0に設定しようとしました。

MySubEntity $ idフィールドをCountryエンティティから自動入力する必要があるのは誰ですか?

+0

最初、私は真= NULL可能で、あなたが名前を持つ2つのフィールドを持っている= ID –

+0

idフィールドに適切ではないと思います。 'nullable = true'は関連する行である可能性があるが、(オプションではない)関係のためのものです。 2つの '$ id'フィールドはそれぞれ独自のEntityに置かれているので、これはうまくいくはずです。 –

+0

'NULL可能= false'を両方' $ id'フィールドに – phpPhil

答えて

3

あなたはIDではない何かにJoinColumn名のプロパティを変更する必要がありますが:

/** 
* @ORM\OneToOne(targetEntity="MySubEntity", cascade={"persist", "remove"}) 
* @ORM\JoinColumn(name="mysubentity_id", referencedColumnName="id", nullable=true) 
*/ 
private $mysubentity; 

これは何をするのか: JoinColumnは関係が保存されているデータベースの列に教義を伝えます。したがって、mysub_idと呼ぶと、メインエンティティには、その名前の列が参照され、referencedColumn値が永続化されます(subEntityのID)。

あなたがエンティティの主キーによって既に使用されているIDである場合、JoinColumn名は矛盾しています。

編集:

私は同じ主キーを共有してあなたのポイントを逃しました。これには特別な理由はありますか? しかし、あなたは本当に、レガシーの理由でそれを行うのいずれか

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html#use-case-2-simple-derived-identity

または、この場合に生成戦略(NONEまたはカスタムを変更することによって、自分でサブエンティティの主キー値を生成する可能性を見るために必要がある場合)

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#identifier-generation-strategies

+0

あなたは全く同じですが、私は両方のテーブルで同じプライマリキーを使用した理由はありませんでした。これは有効であり、Doctrineと私の意見ではうまくいくはずです。私はスキーマを変更し、代わりに新しい 'my_sub_entity_id'カラムを追加しました。次に、新しいキー名を反映するようにアノテーションを変更しました。すぐに機能しました。ご協力いただきありがとうございます! – phpPhil

関連する問題