个性化阅读
专注于IT技术分析

如何在Symfony 2中为Doctrine存储库创建自定义方法

本文概述

使用学说创建自定义查询是一项日常工作, 但是通常有些查询需要使用多次, 并且占用4行以上的代码。

一个普通的, 理智的开发人员在每次需要该查询时都不想写它!这就是为什么我们将创建自定义方法的原因, 因为除了节省不必要的代码行之外, 还使我们的代码更具可维护性, 并且是一种好习惯。

1.为捆绑包中的自定义方法创建一个文件夹。

我们将创建一个文件夹, 其中将包含带有用于存储库的自定义方法的类的文件夹, 建议在你包的根文件夹(控制器, 实体, 表单文件夹旁边)中创建该文件夹。该文件夹的名称为”存储库”。

2.使用自定义方法创建一个类

现在, 我们需要使用用于存储库的自定义方法创建类, 它必须具有以下结构:

<?php

namespace myapp\myBundle\Repository; // Declare the namespace with your bundle path and "/Repository" in the end

use Doctrine\ORM\EntityRepository; // We need the Entity Repository

/**
 * RegisterRepository
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class mynameRepository extends EntityRepository // Give a name to your class
{
    // A simple count method that we will call in the controller like this : $total = $em->getRepository('mybundle:Something')->countSomething();
    public function countSomething()
    {
        return  $this->getEntityManager()
                ->createQuery('SELECT COUNT(a) FROM myBundle:Something a')
                ->getSingleScalarResult();
    }
}

3.根据你的映射样式激活存储库

众所周知, 在带有符号的symfony 2中创建实体的方法不止一种。根据你的首选方法, 你将需要通过以下方式激活类:

  • A)标注方法

我们将以下代码添加到我们要创建自定义方法的实体文件中:

// The entity should be in : src/myapp/myBundle/Entity/Something.php
/**
 * @ORM\Entity(repositoryClass="myapp\myBundle\Repository\mynameRepository")  //Here goes the namespace of our custom methods class with the name of the class in the end (check step 2 namespace)
 */
class Something
{
    // ..
}

  • B)没有注释方法

找到orm映射文件(通常在myBundle / resources / config / doctrine / myfile.orm.yml中)并添加repositoryClass行

myapp\myBundle\Entity\Something: # This already exist
    type: entity # This already exist
    table: something # This already exist
    repositoryClass: myapp\myBundle\Repository\mynameRepository # Add the custom repository class path to the orm.yml file

4)重建实体

只需对你的捆绑包运行主义的generate:entites命令

php app/console doctrine:generate:entities myBundle

如果你正确完成了所有操作, 则可以从存储库中调用自定义方法。如果你使用的是自定义存储库类, 则仍然可以正常使用默认查找程序方法, 例如find()和findAll()。

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 2中为Doctrine存储库创建自定义方法

评论 抢沙发

评论前必须登录!