本文概述
使用学说创建自定义查询是一项日常工作, 但是通常有些查询需要使用多次, 并且占用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()。
评论前必须登录!
注册