エンティティ テンプレートと別のリクエストがあります。基本的に、テンプレートは html フォームを表し、リクエストはフォームに入力された値のコレクションとテンプレート ID への参照を表します。
class Request {
/**
* @Id @Column(type="integer")
* @GeneratedValue
*/
private $id;
/**
* @ManyToOne(targetEntity="Template", cascade={"persist"})
* @JoinColumn(name="templateId", referencedColumnName="id", nullable=false)
*/
private $template;
...
私が達成しようとしているのは、Request が DB からロードされると、オブジェクトは関連する Template オブジェクトとそのすべてのデータを保持することです。ただし、リクエストが保存される場合、テンプレートも保存する必要はありません... したがって、cascade={"persist"} はそこにあるべきではありません。
1- データベースからすべてのテンプレートをロードします 2- ユーザーがドロップダウンからテンプレートを選択します 3- Tmeplate が画面に表示され、ユーザーが入力します 4- リクエストが保存されます
$request = new \entities\Request();
//template already exist in the db
$template = $this->templateRepository->fetchTemplate(1);
$request->template = $template;
...
$this->entityManager->persist($request);
$this->entityManager->flush();
問題は、casade persist を使用すると、テンプレート テーブルに別のテンプレートが保存されることです。カスケードを使用しないと、エラーが持続します。
致命的なエラー: 例外 'Doctrine\ORM\ORMInvalidArgumentException' がキャッチされず、メッセージ 'A new entity was found through the relationship 'entities\Request#template' that was not configured to cascade persist operations for entity: entities\Template@00000000343e07770000000073e3b0ec. この問題を解決するには: この不明なエンティティで EntityManager#persist() を明示的に呼び出すか、カスケードを構成してこの関連付けをマッピングで保持します (例: @ManyToOne(..,cascade={"persist"}))。問題の原因となっているエンティティを特定できない場合は、'entities\Template#__toString()' を実装して手がかりを得てください。C:\Development\wamp\www\vendor\doctrine\orm\lib\Doctrine\ORM\ORMInvalidArgumentException.php の 59 行目
望ましい動作を達成するための正しい Doctrine 関係設定は何ですか?