1

エンティティのコレクション「AnnualReportStaffing」を受け入れるエンティティ「AnnualReport」があります。年次報告書には 4 つの異なる人員配置セクションがあるため、これらのコレクションのうちの 4 つ (ArrayCollection) があります。従来の 1 対多の関係を使用できないため、ここで説明されているように、Join Table で One-To-Many を使用する必要があります。

たとえば、Staffing コレクションの 1 つは、AnnualReport クラスで次のように定義されています。

/**
 * @ORM\ManyToMany(targetEntity="AnnualReportStaffing", cascade={"persist"}, orphanRemoval=true, fetch="LAZY")
 * @ORM\JoinTable(name="annualreports_staffingtenure",
 *      joinColumns={@ORM\JoinColumn(name="staffing_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="annualreport_id", referencedColumnName="id")},
 *      )
 */
private $staffing;

AnnualReport を削除するときが来たら、Doctrine は結合テーブル内のレポートと Staffing の間の関係を削除しますが、関連する AnnualReportStaffing エンティティは削除しません。cascade={"remove"} を追加しようとしましたが、結合テーブルの関連付けが削除される前に Staffing エンティティを削除しようとしているため、外部キー違反が発生します。

孤立した Staffing エンティティを削除する最良の方法は何ですか? 明らかに orphanRemoval=true は答えではありません。

4

2 に答える 2

1

解決策は、最初に スタッフィング エンティティを ORM から切り離して、追跡されないようにすることです。デタッチされた後、外部キー違反なしで削除できます。また、レポート自体を削除するには、逆列に onDelete="CASCADE" を設定する必要がありました。これが最も安全または最も洗練されたソリューションであるとは確信していませんが、この特定のユースケースではうまくいくようです.

/**
 * @ORM\ManyToMany(targetEntity="AnnualReportStaffing", cascade={"persist", "detach", "remove"}, orphanRemoval=true, fetch="LAZY")
 * @ORM\JoinTable(name="annualreports_staffingtenure",
 *      joinColumns={@ORM\JoinColumn(name="annualreport_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="staffing_id", referencedColumnName="id", onDelete="CASCADE")},
 *      )
 */
于 2016-06-02T20:06:13.687 に答える
0

次のように試すことができます:

@ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
于 2016-06-02T20:03:22.453 に答える