2016-08-19 21 views
1

更新01.09.2016私のプロジェクトを更新しました:私は自分のエンティティでカスタムJoinColumnを取り除きました(今は生成され、プロジェクトはw/oエラーで動作します)。そして、私は質問短縮に決めた:カスタムJoinColumn名前を持つDoctrineのManyToOne ORM結合

symfony 2.7、教義2.7とManyToOne単方向関連してカスタムという名前のJoinColumnを使用することをお勧めしますか?

私のケースだった。(多くのIPアドレスを保持している)


多くipGroup実体ワンipGroupPrametersエンティティに関連付けされなければなりません。

1):私は3つの亜種( 'ワークフロー' を参照)内のコードを実行しようと、さまざまなエラーを取得しています


(以下のコードを参照してください)。エラー、だけipGroupParamsを充填 DBテーブル、およびはipGroupにテーブルを任意の行を挿入しません。

2)。 "お知らせ:未定義のインデックス:ipGroupId" ベンダー/ドクトリン/ ORM/libに/ドクトリンで/ ORM /存続/ BasicEntityPersister.phpラインで685

$value = $newValId[$targetClass->fieldNames[$targetColumn]]; 

本当に奇妙である - $ targetClass ipGroupIdでを持っていますfieldNames(デバッガが示すように);

3)。 (この変形例では、の関係にあります)DBAL例外:INSERT INTO ipGroup(ipGroupId、ip)VALUES(?、?)をparams [null、 "134.17]で実行中に例外が発生しました。 26.129 "] ipGroupIdをnullにすることはできません。 $ gObjにsetIpGroupIdメソッドを適用するので、これは魔法です。これはRAMで更新されます(デバッガで表示されます)。

ワークフローは次のとおりです。

public function createIpGroup() 
{ 
    $this->createParamsObj(); 
    $gObj = new \Bmw\StatBundle\Entity\ipGroup(); 
    $gObj->setIpGroupId($this->groupId); 
    $gObj->setIp($ip); 
    ### 1 variant 
    $gObj->setIpGroupParams($this->paramsObj); 
    ### 2 variant 
    $gObj->setIpGroupParams($this->paramsObj); 
    $this->em->persist($gObj); // if not rely on cascade persist 
    ### 3 variant 
    $this->paramsObj->addIpGroup($gObj); 
    $this->em->persist($this->paramsObj); 
    ### 
    $this->em->flush(); 
} 
public function createParamsObj() 
{ 
    $pObj = new \Bmw\StatBundle\Entity\ipGroupParams(); 
    $this->groupId = $this->container->get('my.id.generator')->generate(); 
    $pObj->setIpGroupId($this->groupId); 
    $this->em->persist($pObj); 
    $this->em->flush(); 
    $this->paramsObj = $pObj; 
} 
ここ

エンティティコード初期である、 - 私はドキュメントを実行します。GEN:

/** 
* ipGroup 
* 
* @ORM\Table(
* uniqueConstraints={ 
* @UniqueConstraint(name="ip", columns={"ip"}), 
* @UniqueConstraint(name="userId", columns={"userId"}), 
* }, 
* indexes={@Index(name="ipGroupId", columns={"ipGroupId"})}, 
*) 
* @ORM\Entity 
*/ 
class ipGroup 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="ipGroupId", type="integer") 
    */ 
    private $ipGroupId; 

    /** 
    * @ORM\ManyToOne(targetEntity="ipGroupParams", inversedBy="ipGroup") 
    * @ORM\JoinColumn(name="ipGroupId", referencedColumnName="ipGroupId") 
    */ 
    private $ipGroupParams; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="ip", type="string", length=45, nullable=true) 
    */ 
    private $ip; 
} 
:エンティティ
が自動的にゲッターとセッターを作成します
/** 
* ipGroupParams 
* 
* @ORM\Table(
* uniqueConstraints={ 
* @UniqueConstraint(name="ipGroupId", columns={"ipGroupId"}), 
* } 
*) 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks() 
*/ 
class ipGroupParams 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 


    /** 
    * @ORM\OneToMany(targetEntity="ipGroup", mappedBy="ipGroupParams", cascade={"persist", "remove"}, orphanRemoval=TRUE) 
    */ 
    private $ipGroup; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="ipGroupId", type="integer") 
    */ 
    private $ipGroupId; 
} 
+0

Dhumb質問:エンティティのセッターとゲッターを生成しましたか? –

+0

よろしく、@GeraldChablowski、getters/setters生成コード[link](https://docs.google.com/document/d/1c1V34ekmPbYfDGNAFfRgNVb8Tpvalmo3_dwpNO67NDI/edit?usp=sharing) – Parks

答えて

0

Doctrineは自動的に2つのオブジェクトをリンクしませんが、が持続するので同じ時間に保存しません。。それは動作するはずです:

public function createIpGroup() 
{ 
    $this->createParamsObj(); 
    $gObj = new \Bmw\StatBundle\Entity\ipGroup(); 
    $gObj->setIpGroupId($this->groupId); 
    $gObj->setIp($ip); 
    $gObj->setIpGroupParams($this->paramsObj); 

    $this->paramsObj->addIpGroup($gObj); 

    $this->em->persist($gObj); 
    $this->em->flush(); 
} 
+0

を参照してください。ありがとうございます。 **変形2 **。また、永続化が自動的に発生すると仮定します。@OneToMany(...、cascade = {"persist"、 "remove"}、...)表記はipGroupParamsエンティティで... – Parks

+0

私はそれを編集して$ gObj - > setIpGroupId($ this-> groupId);.今すぐ働かなければならない。 –

+0

申し訳ありませんが、@GeraldChablowski、あなたはどんな行も追加しませんでした.2,3'rdバリエーションを組み合わせただけです。 – Parks

関連する問題