2017-06-14 20 views
0

これは、レコードを結合エンティティに挿入しようとしたときにDoctrineに問題が発生したことを意味します。以下は問題の簡単な説明です。Doctrine:外部関係を設定する

私は2つのテーブルを持っています。それらをOneTwoと呼んでいます。テーブルOneにはtwoIdというテーブルTwoの外部キーがあり、カラムはtwo_idです。フィールドtwo_idは、プライマリキーの一部であることがあります。

* @ORM\Id 
* @ORM\Column(name="user_id", type="string", length=40) 
*/ 
private $twoId; 

/** 
* @ManyToOne(targetEntity="[...]", inversedBy="[...]", fetch="EAGER") 
* @JoinColumn(name="two_id", referencedColumnName="id", onDelete="CASCADE") 
*/ 
private $two; 

私はこの作品テーブルAに新しいレコードを挿入しようとしています:

$two = [.. read from DB ..]; 
$one = new One(); 

$one->setTwo($two); 
$one->setTwoId($two->getId()); 

$em->persist($one); 
$em->flush(); 

私はsetTwosetTwoIdの両方を呼び出すために好きではありません。さらに、私はそれを参照する前に$twoレコードを読むのは嫌いです。

setTwoIdコールをスキップすると、エラーが発生します。エンティティのタイプ[..]に、フィールド 'twoId'に割り当てられたIDがありません。このエンティティの識別子生成戦略では、EntityManager#persist()が呼び出される前にIDフィールドを設定する必要があります。

私はsetTwo呼び出しをスキップした場合、私はエラーを取得:整合性制約違反を:

  1. 私は両方setTwo()を呼び出しを避けることができます方法:1048列 'two_idは'

    私の問題があるnullにすることはできませんとsetTwoId()

  2. Twoからエンティティを参照したい場合はどうすれば$em->getReference()を使用する必要がありますか?

+0

我々はモデルのコードを参照する必要があります。なぜ 'one'エンティティ上に' setTwoId() '関数があるのだろうと思います。あなたの2番目の質問について:entityManagerの参照を使用するにはIDを知る必要があります。それは、プロキシクラスを介してオブジェクトを取得し、そのクラスのそれ以上の属性にアクセスしようとすぐにそれを水和するので、はいそれを参照するために使用することができます。 – lordrhodos

+0

あなたは正しい@lordrhodosですが、 'setTwoId'関数は悪い考えです。手伝ってくれてありがとう。 – user3429660

答えて

0

を(PhpStormもそれを認識しない)誰かが同じ間違いを作る場合:

としてはDoctrineはなくても、自動的に作成されますので、$twoIdが間違っていたフィールドを宣言する、@lordrhodosによって指摘定義。

定義:

/** 
* @ManyToOne(targetEntity="[...]", inversedBy="[...]", fetch="EAGER") 
* @JoinColumn(name="two_id", referencedColumnName="id", onDelete="CASCADE") 
*/ 
private $two; 

使用法:

$two = [.. read from DB ..]; 
$one = new One(); 

$one->setTwo($two); 

$em->persist($one); 
$em->flush(); 
関連する問題