Doctrine orm 存储库的最佳实践是什么?
在我的存储库中,我有太多参数的方法(用于where): 示例: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
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和自定义查询:)