1

「便利な」クエリを実装するためのベスト プラクティスについて質問がありました。この記事を参照して:

http://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/#toc-install-doctrine-modules

エンティティ マネージャが IndexController で使用できることは明らかです。彼は findAll を実行して、データベースの内容全体を一覧表示します。しかし、データベースに「バンド」列を追加してマッピングし、ビートルズのすべてのアルバムをクエリしたい場合はどうなるでしょうか。ビートルズのアルバムがコードベース全体でかなり頻繁に使用されていたとしたらどうでしょう (弱い例ですが、わかります)。

EM はコントローラーでのみ使用できるようで、クラスは実際にはサービス ロケーターを認識していないようです。

  • コントローラーで DQL を分割し、必要なすべてのコントローラーで DQL を繰り返しますか? (あまりドライではない)
  • 代わりに、エンティティまたはモデルから EM へのアクセスを微調整しますか?

Zend_Db の単純な使用法ほど単純ではないように思えます。Zend_Db のように、好きな場所でクエリを発行して、不正を行って物事を成し遂げることができます。

Table Gateway の世界から「本物の」ORM に移行するのを手伝ってくれてありがとう。

4

1 に答える 1

2

ええと、Doctrine 2 は関係を処理できます (例: バンドからアルバムへ、またはその逆)

EntityManager は、クラスをサービスとして定義する限り、希望するすべてのクラスで使用可能にすることができます。つまり、内部でModule.php次のようなファクトリを定義できます。

// Implement \Zend\ModuleManager\Feature\ServiceProviderInterface
public function getServiceConfig() {
    return array(
        //default stuff
        'factories' array(
            'my-album-service' = function($sm) {
                $service = new \My\Service\Album();
                $service->setEntityManager($sm->get('doctrine.entitymanager.orm_default'));
                return $service;
            }
        )
    )
);

次に、ServiceManager を認識しているすべてのクラスからこのクラスを呼び出すことができます。$this->getServiceLocator()->get('my-album-service')

このクラスは Doctrine EntityManager で自動的に注入されます。

明確にするために:実行するすべてのクエリは、サービス内に配置する必要があります。基本的にDoctrine 2のDB_Mapperであるエンティティがあり、次に、、、、、などのアクションを実行するサービスがadd()あります...edit()findAll()findCustomQuery()

次に、サービスにコントローラーからのデータを入力します。サービスはデータをコントローラーに返し、コントローラーはそのデータをビューに渡します。それはあなたにとって意味があり、あなたの質問に答えますか?

于 2012-10-27T07:44:19.090 に答える