今回は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によって管理されていないために必要となる対応です。

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

関連するカスタマイズ

1サイトから複数のデータベースに接続する方法... 複数のEntityManagerを利用し、複数のデータベースからデータを取得したり更新する方法はないのかというご質問をよくお受けします。 既存サイトとの連携やモールショップ化では頻繁に必要となってくる技術かと思います。 なかなか説明するのは難しいのですが、Doctrineの設定上でア...
decimalタイプのオプション、precisionとscaleとは?... テーブルの定義ファイル(dcm.yml)を見てみると、price02やtaxなど金額関係のカラムにはdecimal型が使われていることが分かります。 ProductClass.dcm.ymlには下記のように記載があります。 他のカラムの定義には見かけないprecisionとsca...
マイグレーションでショップ設定を変更・共有する方法... 弊社ではショップ設定を変更する時は必ずマイグレーションファイルの実行により行います。 例えば初期状態では有効になっている仮会員を無効にしたり、自動ログイン機能をONにすることを前提にカスタマイズを行なっていく場合などです。 上記コマンドを実行することでマイグレーションファイルが作...
SQL(Doctrine)のキャッシュ時間を変更してページ高速化... Doctrineでは次のようにして検索結果をキャッシュしておくことができます。商品数やカテゴリー数が多い場合は一気にページが高速化するサイトもありますので場合によってはたいへん有用です。 EC-CUBEのデフォルトでもコード内で何箇所か使用されており、$lifetimeがキャッシュの有...