5

データベースに次の関連付けがあります (簡易版):

データベーススキーマ

これは多対多の関連付けですが、結合テーブルに属性があるため、One-To-Many/Many-To-One associations を使用する必要があります

1 つの注文項目に必要な数のリレーションを追加して同時に作成できるフォームがあります (主に、ドキュメントのフォームのコレクションを埋め込む方法のチュートリアルに触発されました。

フォームを投稿すると、次のエラーが表示されます。

タイプ TEST\MyBundle\Entity\Relation のエンティティは、外部エンティティ TEST\MyBundle\Entity\Order を介して ID を持っていますが、このエンティティ自体には ID がありません。「TEST\MyBundle\Entity\Relation」を永続化する前に、関連するエンティティで EntityManager#persist() を呼び出し、識別子が生成されていることを確認する必要があります。Post Insert ID Generation (MySQL Auto-Increment や PostgreSQL SERIAL など) の場合、これは両方の永続操作の間に EntityManager#flush() を呼び出す必要があることを意味します。

リレーションにオプションRelationがあるため、Doctrine は注文に関連するオブジェクトを永続化しようとするため、このエラーを理解しています。しかし、どうすればこの動作を回避できますか?cascade={"persist"}OneToMany

エンティティを削除cascade={"persist"}して手動で永続化しようとしましたが、同じエラーが発生します ( flush()ID を取得するために注文する必要があり、注文すると同じエラー メッセージが表示されるため)。の前のオブジェクト
も試してみましたが、うまくいきませんでした。detach()Relationflush()

4

3 に答える 3

1

関係レコードを永続化してフラッシュする前に、オリジナルを永続化してフラッシュする必要があります。エラーの理由については 100% 正しいです。

図から、連絡先との関係を同時に追加して注文しようとしていると思いますか? その場合、関係を永続化してフラッシュする前に、注文を永続化してフラッシュする必要があります。または、リレーション テーブルに主キーを追加することもできます。

于 2013-04-09T19:04:49.073 に答える
1

Relation最終的に、テーブルに個別の主キーを作成することになりました(複合キーを作成する代わりに)。
これは汚い修正のように見えます。この状況を処理するためのより良い方法があると確信していますが、今のところ機能しています。

ここに私のRelationsエンティティがあります:

/**
 * Relation
 *
 * @ORM\Entity
 */
class Relation
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Contact", inversedBy="relation")
     */
    protected $contact;

    /**
     * @ORM\ManyToOne(targetEntity="Order", inversedBy="relation")
     */
    protected $order;

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

    //Rest of the entity...

次に、次の関係にcascade={"persist"}オプションを追加しました。OneToManyOrder

/**
 * Orders
 *
 * @ORM\Entity
 */
class Order
{   
    /**
     * @ORM\OneToMany(targetEntity="Relation", mappedBy="order", cascade={"persist"})
     */
    protected $relation;

    //Rest of the entity...

ほら!

于 2013-04-11T23:29:46.347 に答える