2017-12-18 13 views
-2

私が持っている:クエリを保存する場所ArticleControllerはで

$em = $this->get('doctrine.orm.entity_manager'); 
$dql = "SELECT a FROM AcmeMainBundle:Article a WHERE a.showing = 1 ORDER BY createdAt DESC"; 
$query = $em->createQuery($dql); 

$paginator = $this->get('knp_paginator'); 
$pagination = $paginator->paginate(
    $query, /* query NOT result */ 
    $request->query->getInt('page', 1)/*page number*/, 
    10/*limit per page*/ 
); 

そしてAdminControllerに私が持っている:

$em = $this->get('doctrine.orm.entity_manager'); 
    $dql = "SELECT a FROM AcmeMainBundle:Article a WHERE a.showing = 1 ORDER BY createdAt DESC"; 
    $query = $em->createQuery($dql); 
    $results = $query->getResults(); 

だから私は重複があります。

$em = $this->get('doctrine.orm.entity_manager'); 
$dql = "SELECT a FROM AcmeMainBundle:Article a WHERE a.showing = 1 ORDER BY createdAt DESC"; 
$query = $em->createQuery($dql); 

データベースからの結果はRepositoriumに保管してください結果や実行がないクエリの場合はどうでしょうか?

正しいプログラミングのルールに従って結果/実行なしでクエリを保持する場所はありますか?

このクエリは、サービスを含むいくつかの場所で使用します。

+1

リポジトリは依然として良い場所です。やや関連性の高い - [CQRS原則](https://en.wikipedia.org/wiki/Command%E2%80%93query_separation) – svgrafov

+0

一般的には、それらを[データマッパー](https://martinfowler.com/eaaCatalog/dataMapper.html)に保管する必要があります。しかし、あなたがDoctrineを使用しているので、それはちょっとした選択肢ではありません。だから、リポジトリはそれです。 –

答えて

1

ベストプラクティスは、Entity Repositoryクラスにクエリを格納することです。コントローラで簡単に再利用したり、サービスに注入したりすることができます。異なるメソッドを実装して、結果セット、Queryオブジェクト、または必要なものを返すことができます。

namespace AppBundle\Repository; 

use Doctrine\ORM\EntityRepository; 

class ProductRepository extends EntityRepository 
{ 
    public function getAllOrderedByNameQuery() 
    { 
     return $this->getEntityManager() 
      ->createQuery(
       'SELECT p FROM AppBundle:Product p ORDER BY p.name ASC' 
      ); 
    } 
} 
+0

しかし、それは結果のないクエリなので、あなたの例は悪いです。私はクエリだけを持っている必要があります。 – ziran

+0

サンプルを調整しました。リポジトリメソッドで必要なものを返すことができます。これは、データフェッチロジックが生きるべき正しい場所です。 –

+0

...コントローラーではなく、サービスに何らかのアクションをディスパッチしてテスト可能に保つ必要があります –

関連する問題