我正在开发一个网络应用程序,我可能有一些逻辑,例如"当字段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();
因此,我希望能够撰写复杂的"来自我的,简单的,但商业驱动的部分的查询。
答案 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() ;
请参阅文档以了解适合您任务的其他方法:
答案 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作为参数调用方法。