これは、レコードを結合エンティティに挿入しようとしたときにDoctrineに問題が発生したことを意味します。以下は問題の簡単な説明です。Doctrine:外部関係を設定する
私は2つのテーブルを持っています。それらをOne
とTwo
と呼んでいます。テーブル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();
私はsetTwo
とsetTwoId
の両方を呼び出すために好きではありません。さらに、私はそれを参照する前に$two
レコードを読むのは嫌いです。
setTwoId
コールをスキップすると、エラーが発生します。エンティティのタイプ[..]に、フィールド 'twoId'に割り当てられたIDがありません。このエンティティの識別子生成戦略では、EntityManager#persist()が呼び出される前にIDフィールドを設定する必要があります。
私はsetTwo
呼び出しをスキップした場合、私はエラーを取得:整合性制約違反を:
私は両方
setTwo()
を呼び出しを避けることができます方法:1048列 'two_idは'私の問題があるnullにすることはできませんと
setTwoId()
?Two
からエンティティを参照したい場合はどうすれば?$em->getReference()
を使用する必要がありますか?
我々はモデルのコードを参照する必要があります。なぜ 'one'エンティティ上に' setTwoId() '関数があるのだろうと思います。あなたの2番目の質問について:entityManagerの参照を使用するにはIDを知る必要があります。それは、プロキシクラスを介してオブジェクトを取得し、そのクラスのそれ以上の属性にアクセスしようとすぐにそれを水和するので、はいそれを参照するために使用することができます。 – lordrhodos
あなたは正しい@lordrhodosですが、 'setTwoId'関数は悪い考えです。手伝ってくれてありがとう。 – user3429660