在模型中放置数据库查询的位置? (Symfony框架)

时间:2014-09-12 14:21:02

标签: php symfony doctrine-orm

我是PHP编程和Symfony的新手。英语不是我的母语,如果我的写作听起来很奇怪,那就很抱歉...

我有两个实体:文章类别,其中每篇文章都有一个类别。我需要展示给定类别的文章数量:

类别 ------------------

车辆-------------------- 4

电子产品---------------- 20

食物----------------------- 15

家具------------------ 8

使用Doctrine我为两个实体制作了CRUD文件。

 php app/console doctrine:generate:crud 

就像我说的那样,问题是我想要显示一个包含类别(名称,描述等)属性的表格以及库存中有多少条款。

SQL查询非常简单:

SELECT count(*) FROM Articles a WHERE a.id_category = $id_category

放在哪里?!我很困惑,不想制定最佳实践规则。 Doctrine生成了大量文件:ArticleController.php,ArticleType.php(Form)以及视图的所有.twig。类别相同。

3 个答案:

答案 0 :(得分:2)

本着直接回答您问题的精神:您需要的是custom Doctrine Repository,在这种情况下为ArticleRepository

e.g。 的 ArticleRepository.php

namespace ACME\DemoBundle\Article;

use Doctrine\ORM\EntityRepository;

class ArticleRepository extends EntityRepository
{
    public function countForCategory($id)
    {
        $result= $this->createQueryBuilder('a')
            ->join('a.category', 'c')
            ->where('c.category_id = :id')
            ->setParameter('id', $id)
            ->select('count(a')
            ->getQuery()
            ->getSingleScalarResult();

        return $result;
    }
}

然后将Article实体设置为使用ArticleRepository

<强> Article.php

/**
 * @ORM\Entity
 * @ORM\Table(name="article")
 * @ORM\Entity(repositoryClass="ACME\DemoBundle\Entity\ArticleRepository")
 */
class Article
{
/// etc...

然后,您可以获取实体的存储库,例如您的控制器(尽管在其他地方建议您可以在某种服务中隐藏它以避免使用业务逻辑填充控制器;它只需要从控制器内部以某种方式访问​​),然后运行查询:

<强> ArticleController

class ArticleController extends Controller
{
    public function countAction($id)
    {

        $articleRepo = $this->getDoctrine()->getRepository('DemoBundle:Article');

        $count = $articleRepo->countForCategory();
        //etc...

NB如果你真的想要你的例子中的输出,那么为整个表做一个查询可能更有效,可能在CategoryRepository中,按类别执行计数和分组。该查询将返回一个包含类别名称和计数的数组。

答案 1 :(得分:1)

使用Symfony2 + Doctrine2时,

  1. 不要想(关于这个数据库)。想想持久性数据对象,即所谓的实体,让Doctrine处理它们。但是,花一些时间干净地定义这些对象之间的关系。

  2. 忘记术语“MVC”。 MVC是一个相当抽象的概念,事物在现实中更复杂。 Fabian(SF的主要开发者)对此主题有一个很好的描述:http://fabien.potencier.org/article/49/what-is-symfony2

  3. 如果您想知道在Symfony软件包中放置什么内容,请阅读此Cookbook文章:http://symfony.com/doc/current/cookbook/bundles/best_practices.html

答案 2 :(得分:0)

在服务层中创建一个CategoryManager类,并处理那里的任何业务逻辑。您可以通过依赖注入将路由器传递给它。

对于您的示例,CategoryManager将具有getUrl(Article $ article)方法,该方法将使用路由器实例(您通过__construct注入或单独的setter方法)根据$ article的属性生成Url,并返回它

此方法将确保您的业务逻辑不会污染视图或控制器层。

点击此链接Services Symfony