1

エンティティ テンプレートと別のリクエストがあります。基本的に、テンプレートは 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 関係設定は何ですか?

4

0 に答える 0