在Doctrine中的查询之间共享逻辑

时间:2014-05-30 12:06:48

标签: symfony doctrine-orm

我正在开发一个网络应用程序,我可能有一些逻辑,例如"当字段A =值和字段B =其他值时,这应该显示在前端。"我可能有不同的列表,进一步详细阐述。我甚至可能翻译了在不同实体中具有翻译的实体(例如:Entity和EntityTranslation),并且只想在特定区域设置上加入它们。

我如何重用所有这些逻辑,以避免在整个地方重复相同的QueryBuilder::andWhere()QueryBuilder::join()(偶数QueryBuilder::select())来电?

我发现了http://www.whitewashing.de/2013/03/04/doctrine_repositories.html就此问题进行了讨论,但我对那些涉及JOIN和SELECT的解决方案感到好奇。

编辑:

我想要的不好的例子:

$queryBuilder
    ->andWhere(FRONTEND_LOGIC)
    ->joinWithTranslationTable();

因此,我希望能够撰写复杂的"来自我的,简单的,但商业驱动的部分的查询。

2 个答案:

答案 0 :(得分:0)

您可以在Doctrine的DBAL层中使用预准备语句。

   $dbal = $this->getDoctrine()->getConnection('default');
   $stmt = 'SELECT name, birth from user where id = :id';

   $user1 = $dbal->executeQuery( $stmt , array( 'id' => 1 ) )->fetchAll() ;
   $user2 = $dbal->executeQuery( $stmt , array( 'id' => 2 ) )->fetchAll() ;

请参阅文档以了解适合您任务的其他方法:

http://docs.doctrine-project.org/projects/doctrine-dbal/en/2.0.x/reference/data-retrieval-and-manipulation.html#using-prepared-statements

答案 1 :(得分:0)

Doctrine不允许您指定查询构建器类,因此您无法直接扩展它。但是你可以装饰它。

class MyQueryBuilder
{
    public function __construct($doctrineQueryBuilder) { this->doctrineQueryBuilder = $doctrineQueryBuilder; }

    // Your custom functions
    public function addWhereFrontEndLogic ...
    public function joinWithTranslationTable ...

   // Also need to add the the regular methods that you use
   public function addSelect($value) { return $this->doctrineQueryBuilder($value); }

// You would then
$qb = new MyQueryBuilder($this->createQueryBuilder());

必须添加所有标准功能有点痛苦,但是一旦完成它,您就可以根据需要添加尽可能多的自定义业务逻辑。

还有一些其他可能的方法。您可以将自定义方法添加到基本存储库类,然后只使用doctrine $ qb作为参数调用方法。