0

背景:

  • これは、フレームワークを使用せずに構築された MVC アプリケーション用ですが、MVC パラダイムに従います。
  • RedBeanという ORM ライブラリを使用してデータベースと通信しています。
  • RedBean は「Bean」を使用してデータを表現しますが、モデルへのラップをサポートしているため、モデルによってカスタム関数が提供される場合があります。

    $account = R::dispense('account');
    $account->name = "john";
    R::store($account);
    $account->getFormattedLastUpdatedTime('America/New_York');
    

今質問:

現在、モデルの各インスタンスは、データベース内の 1 つの行を表します。アカウントのコレクションがある場合、「アカウント」モデルの配列があります。

アプリケーションには、カスタム プロファイル フィールドの機能があります (心配しないでください。私は EAV を使用していません :))。テーブルの 1 つは、カスタム プロファイル フィールドのフォーム フィールドを生成するためのフィールド (名前、説明など) のメタデータを格納します。ここでも、メタデータの各行は 1 つのフォーム フィールドを表し、各行は 1 つのモデルで表されます。

ここで、これらすべての行をフォーム オブジェクトに変換するメソッドを作成して、フォームのレンダリングと処理に使用できるようにしたいと考えています。しかし、このメソッドはどこにあるのでしょうか? 私が最初に考えたのは、カスタム プロファイル フィールドのメタデータを表すモデルに配置することでした。

明確化: この関数はaccountモデルではなく、profile_fields_metaモデル内にあります。

問題

各モデルは 1 つの行を表す必要があるため、モデルがデータベース内の複数の行から生成されるオブジェクトを返すようにするのは少し「汚い」ようです。これが最善の方法ではないと言うのは正しいですか?代わりに何をすることをお勧めしますか?

4

2 に答える 2

0

「各モデル [インスタンス] は 1 つの行を表す必要がある」という MVC 固有の規定はありません。多くの場合、MVC フレームワークでは、モデル (少なくともコントローラーから見た場合) はデータ ストアを完全に認識せず、「行」の概念や直接のマッピングはありません。ORM の場合は必ずしもそうではありませんが、モデルは ORM の制約に従う必要はありません。

ただし、スキーマと実装について詳しく知らなければ判断するのは困難ですが、記述している機能はアカウント モデルに適していないように思えます。実際、Rails の用語で Account が「多くの」FormField を持つように、「FormField」モデルを検討する必要があるように思えます。

記録として、EAV は常に悪いわけではなく、よく誤用されるだけです。

于 2012-05-21T23:44:29.827 に答える
0

ArrayObject ( http://php.net/manual/en/class.arrayobject.php ) またはその他のコンテナ クラスを拡張して、コレクション用のメソッドを実行するとよいでしょう。指定されている場合は、配列ではなくカスタム コレクション クラスでデータを返すようにクエリ メソッドを変更してみてください。

于 2012-05-21T23:42:43.163 に答える