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

本文概述

  • 1.为捆绑包中的自定义方法创建一个文件夹。
  • 2.使用自定义方法创建一个类
  • 3.根据你的映射样式激活存储库
  • 4)重建实体
使用学说创建自定义查询是一项日常工作, 但是通常有些查询需要使用多次, 并且占用4行以上的代码。
一个普通的, 理智的开发人员在每次需要该查询时都不想写它!这就是为什么我们将创建自定义方法的原因, 因为除了节省不必要的代码行之外, 还使我们的代码更具可维护性, 并且是一种好习惯。
1.为捆绑包中的自定义方法创建一个文件夹。我们将创建一个文件夹, 其中将包含带有用于存储库的自定义方法的类的文件夹, 建议在你包的根文件夹(控制器, 实体, 表单文件夹旁边)中创建该文件夹。该文件夹的名称为” 存储库” 。
2.使用自定义方法创建一个类【如何在Symfony 2中为Doctrine存储库创建自定义方法】现在, 我们需要使用用于存储库的自定义方法创建类, 它必须具有以下结构:
< ?phpnamespace myapp\myBundle\Repository; // Declare the namespace with your bundle path and "/Repository" in the enduse 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 existtype: entity # This already existtable: something # This already existrepositoryClass: 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()。

    推荐阅读