今回はDoctrineのEntityに関するちょっと難しい話題です。

choiceタイプやentityタイプのフォームでデータベースの内容を表示しようとした時(主にセレクトボックスやチェックボックス)

Entities passed to the choice field must be managed. Maybe persist them in the entity manager?

というエラーが発生することがあります。

エラー内容的には「フォームでエンティティを表示するにはentity managerで管理されている必要があるよ。persistしてみたら?」というようなイメージです。
通常entityタイプのフォームを使用するとデータはEntity Managerによって取得されますのでこういったことは起こりません。

経験則では、もしこのエラーが発生した場合はセッションからエンティティを取り出していないかを確認すると良いです。
例えば商品マスタや受注マスタの上部検索エリアは検索した項目を一時的にセッションに保存する仕様となっていますよね。

商品マスタのコントローラー(Eccube\Controller\Admin\ProductController)の中を良く見ると次のようなコードが存在します。

この部分ではセッションから取り出した商品の公開・非公開というステータスのエンティティ(Disp)を一度データベースから読み込み直しています。

これはセッションから取り出したエンティティがEntity Managerによって管理されていないために必要となる対応です。

自分で商品マスター等に検索項目を付け足した場合もそれがエンティティであれば復元作業が必要です。

関連するカスタマイズ

SQL(Doctrine)のキャッシュ時間を変更してページ高速化... Doctrineでは次のようにして検索結果をキャッシュしておくことができます。商品数やカテゴリー数が多い場合は一気にページが高速化するサイトもありますので場合によってはたいへん有用です。 EC-CUBEのデフォルトでもコード内で何箇所か使用されており、$lifetimeがキャッシュの有...
既に存在するIDやRankの最大値を取得する方法... 新規データ作成やプラグインのマイグレーション作成の際に、既に存在するデータの最大値を取得したい場合があります。 そんな時は直接SQLを発行しても良いのですが、Doctrineを使用すると便利です。 商品IDの最大値を取得する方法(例:dtb_product) 次のようにQuer...
Method not allowed / No route found for …エラー... EC-CUBE3でたまに確認されるエラー、Method not allowed エラーについて説明します。Whoops, looks like something went wrong.と怒られてしまった場合は、このエラーのことを思い出して見てください。 EC-CUBEにアクセスする場合、...
マイグレーションによるテーブルへの項目追加... ECCUBE3でのマイグレーションファイルによるテーブルへの項目追加方法をご紹介します。 phpMyAdminやAdminerで追加してもかまいませんが、Migrationファイルを作成して実行すればGitで管理しメンバー間でデータベースの状態を共有可能であることや、再インストール時に自動で適...

弊社はEC-CUBE公式インテグレートパートナーです。