【问题标题】:Where to keep the queries?在哪里保留查询?
【发布时间】:2017-12-18 14:43:38
【问题描述】:

在 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 中,但是如果是没有结果/执行的查询呢?

根据正确的编程规则,在哪里保留没有结果/执行的查询?

我将在几个地方使用这个查询,包括服务。

【问题讨论】:

  • 存储库仍然是他们的好地方。有点相关 - CQRS principle.
  • 一般来说 - 您应该将它们保存在 data mappers 中。但是由于您使用的是 Doctrine,所以这不是最可行的选择。所以,它是存储库。

标签: php symfony doctrine-orm


【解决方案1】:

最佳做法是将查询存储在Entity Repository 类中。您可以轻松地在控制器中重用它或将其注入到您的服务中。您可以实现不同的方法来返回结果集、查询对象或您需要的任何东西。

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'
            );
    }
}

【讨论】:

  • 但它是没有结果的查询,所以你的例子很糟糕。我只需要查询。
  • 调整了我的样本。您可以在存储库方法中返回所需的任何内容。这正是数据获取逻辑应该存在的正确位置。
  • ...而不是控制器,控制器应该只向服务发送任何操作以保持它们可测试
  • 谢谢,但设计模式存储库不应该只返回集合吗?
  • Fowler 建议使用存储库模式作为类似集合的接口来访问域对象。但在实践中,存储库类可以返回单个实体、集合、null、标量值数组(当使用替代水合模式时,例如获取 COUNT 查询结果)和 QueryBuilder/Query 对象(用于 Symfony 表单的 EntityType、分页等.)。只需将数据检索逻辑保留在存储库类中即可重用它并避免查询代码重复。
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2011-08-22
相关资源
最近更新 更多