部門を含むデータベース テーブルがあります。人を含む別のテーブルがあります。ご想像のとおり、部門には多くの人が含まれており、人は 1 つの部門に所属しています。
新しい人をデータベースに保持したいときは、Person オブジェクトを作成し、その Department プロパティを、エンティティ マネージャーによって管理される既存のDepartment オブジェクトに設定しようとします。ただし、新しい Person を永続化しようとすると、例外が発生します。
エンティティの永続操作をカスケードするように構成されていない関係 'Entities\Person#department' を通じて、新しいエンティティが見つかりました: Entities\Department@0000000016abe202000000000d29dd37. この問題を解決するには: この不明なエンティティで明示的に EntityManager#persist() を呼び出すか、カスケードを構成してこの関連付けをマッピングで保持します (例: @ManyToOne(..,cascade={"persist"}))。
エンティティマネージャーを介して抽出したため、部門が「不明なエンティティ」であるという例外の部分を完全には理解していません。
例外が示すように、yml メタデータ ( ) にカスケードを挿入しましたcascade: ["persist"]
。その後、私の人は保存されますが、部門テーブルに部門が複製され、新しいIDが作成されます。
これは非常に一般的な使用例です。コードとメタデータを以下に示します。どのような変更を加える必要がありますか?
メタデータ:
Entities\Person
type: entity
table: people
fields:
...
departmentId:
type: integer
unsigned: false
nullable: false
column: department_id
...
manyToOne:
department:
targetEntity: Entities\Department
joinColumn: department_id
referenceColumnName: id
コード:
$department = $em->getRepository('Department')->findOneBy(array('name' => $departmentName);
$person = new Person();
$person->setName('Joe Bloggs');
$person->setDepartment($department);
$em->persist($person);
$em->flush();