Doctrine orm 存储库的最佳实践是什么?

Doctrine orm 存储库的最佳实践是什么?,doctrine-orm,doctrine,symfony,Doctrine Orm,Doctrine,Symfony,在我的存储库中,我有太多参数的方法(用于where): 示例: class ProchaineOperationRepository extends EntityRepository { public function getProchaineOperation( $id = null, // Search by ID \DateTime $dateMax = null, // Search by DateMax

在我的存储库中,我有太多参数的方法(用于where):

示例:

class ProchaineOperationRepository extends EntityRepository
{
        public function getProchaineOperation(
            $id = null, // Search by ID
            \DateTime $dateMax = null, // Search by DateMax
            \DateTime $dateMin = null, // Search by DateMin
            $title = null // Search by title
        )
在我的控制器中,我有不同的动作。。。对于ID为的get,对于ID为的get和日期为的get,对于ID为的get和标题为

我的方法太难理解了,因为太多的参数。。。而且很难创建许多方法,因为它们几乎是相同的


最佳实践是什么?

如果您的目标只是在每个属性之间使用
运算符进行查询,那么最好的方法可能是使用条令建议的方法:
findBy()
cf:

例如:

$results = $this
            ->getDoctrine()
            ->getRepository('AppBundle:ProchaineOperation')
             ->findBy(array('dateMax' => $myDate, 'title' => 'Hello world');
编辑:评论后


然后使用与规则相同的方法:只传递id为dateMax的数组。。。如果设置了这些键,则将其视为键。这应该可以解决给您带来诸多麻烦的方法签名问题。:)

如果您的目标只是在每个属性之间使用
运算符进行查询,那么最好的方法可能是使用条令提出的方法:
findBy()
cf:

例如:

$results = $this
            ->getDoctrine()
            ->getRepository('AppBundle:ProchaineOperation')
             ->findBy(array('dateMax' => $myDate, 'title' => 'Hello world');
编辑:评论后


然后使用与规则相同的方法:只传递id为dateMax的数组。。。如果设置了这些键,则将其视为键。这应该可以解决给您带来诸多麻烦的方法签名问题。:)

你的问题中有两个主要问题

  • 存储库方法中的参数太多,将在最终查询的“where”条件中使用。你想以更好的方式组织它们
  • 由于传递的参数可能很复杂,因此存储库方法应该可以从控制器以有意义的方式调用
  • 我建议您编写一个存储库方法,如:

    namespace AcmeBundle\Repository;
    
    /**
     * ProchaineOperationRepository
     *
     */
    class ProchaineOperationRepository extends \Doctrine\ORM\EntityRepository
    {
        public function search($filters, $sortBy = "id", $orderBy = "DESC")
        {
            $qb = $this->createQueryBuilder("po");
    
            foreach ($filters as $key => $value){
                $qb->andWhere("po.$key='$value'");
            }
    
            $qb->addOrderBy("po.$sortBy", $orderBy);
    
            return $qb->getQuery()->getArrayResult();
        }
    }
    
    这里的
    $filters
    变量是一个数组,用于保存在“where”条件下要使用的过滤器
    $sortBy
    $orderBy
    对于以正确的顺序获得结果也很有用

    现在,您可以从控制器调用repository方法,如下所示:

    class ProchaineOperationController extends Controller
    {
        /**
         * @Route("/getById/{id}")
         */
        public function getByIdAction($id)
        {
            $filters = ['id' => $id];
    
            $result = $this->getDoctrine()->getRepository("AcmeBundle:ProchaineOperation")->search($filters);
            //process $result
        }
    
        /**
         * @Route("/getByTitle/{title}")
         */
        public function getByTitleAction($title)
        {
            $filters = ['title' => $title];
            $sortBy = 'title';
    
            $result = $this->getDoctrine()->getRepository("AcmeBundle:ProchaineOperation")->search($filters, $sortBy);
            //process $result
    
        }
    
        /**
         * @Route("/getByIdAndDateMin/{id}/{dateMin}")
         */
        public function getByIdAndDateMinAction($id, $dateMin)
        {
            $filters = ['id' => $id, 'dateMin' => $dateMin];
            $sortBy = "dateMin";
            $orderBy = "ASC";
    
            $result = $this->getDoctrine()->getRepository("AcmeBundle:ProchaineOperation")->search($filters, $sortBy, $orderBy);
            //process $result
        }
    
    }
    
    请注意,您正在为所有控制器操作调用相同的存储库方法,并根据您的参数进行微小更改。还要注意,
    $sortBy
    $orderBy
    是可选传递的


    希望有帮助

    你的问题中有两个主要问题

  • 存储库方法中的参数太多,将在最终查询的“where”条件中使用。你想以更好的方式组织它们
  • 由于传递的参数可能很复杂,因此存储库方法应该可以从控制器以有意义的方式调用
  • 我建议您编写一个存储库方法,如:

    namespace AcmeBundle\Repository;
    
    /**
     * ProchaineOperationRepository
     *
     */
    class ProchaineOperationRepository extends \Doctrine\ORM\EntityRepository
    {
        public function search($filters, $sortBy = "id", $orderBy = "DESC")
        {
            $qb = $this->createQueryBuilder("po");
    
            foreach ($filters as $key => $value){
                $qb->andWhere("po.$key='$value'");
            }
    
            $qb->addOrderBy("po.$sortBy", $orderBy);
    
            return $qb->getQuery()->getArrayResult();
        }
    }
    
    这里的
    $filters
    变量是一个数组,用于保存在“where”条件下要使用的过滤器
    $sortBy
    $orderBy
    对于以正确的顺序获得结果也很有用

    现在,您可以从控制器调用repository方法,如下所示:

    class ProchaineOperationController extends Controller
    {
        /**
         * @Route("/getById/{id}")
         */
        public function getByIdAction($id)
        {
            $filters = ['id' => $id];
    
            $result = $this->getDoctrine()->getRepository("AcmeBundle:ProchaineOperation")->search($filters);
            //process $result
        }
    
        /**
         * @Route("/getByTitle/{title}")
         */
        public function getByTitleAction($title)
        {
            $filters = ['title' => $title];
            $sortBy = 'title';
    
            $result = $this->getDoctrine()->getRepository("AcmeBundle:ProchaineOperation")->search($filters, $sortBy);
            //process $result
    
        }
    
        /**
         * @Route("/getByIdAndDateMin/{id}/{dateMin}")
         */
        public function getByIdAndDateMinAction($id, $dateMin)
        {
            $filters = ['id' => $id, 'dateMin' => $dateMin];
            $sortBy = "dateMin";
            $orderBy = "ASC";
    
            $result = $this->getDoctrine()->getRepository("AcmeBundle:ProchaineOperation")->search($filters, $sortBy, $orderBy);
            //process $result
        }
    
    }
    
    请注意,您正在为所有控制器操作调用相同的存储库方法,并根据您的参数进行微小更改。还要注意,
    $sortBy
    $orderBy
    是可选传递的


    希望有帮助

    您的第一个最佳实践可能是回答您的问题。这是您在5小时内发布的第三个问题。另外两个有评论和答案,但没有你的回应。看起来你问了50个问题,只接受了一个问题的答案?哎呀。路过海报不应该期望得到太多帮助。您的第一个最佳实践可能是回答您的问题。这是您在5小时内发布的第三个问题。另外两个有评论和答案,但没有你的回应。看起来你问了50个问题,只接受了一个问题的答案?哎呀。开车路过的海报不需要太多帮助。我的代码在现实中要复杂得多。。。我使用RSM和自定义查询:)实际上我的代码要复杂得多。。。我使用RSM和自定义查询:)