如何在部分中使用自定义 DQL 函数来合成查询结果。
寻找一种在 createQuery 或任何其他学说方式(nativeSql、QueryBuilder)中使用 DQL 函数的方法,它没有必要使用部分,但它应该根据表的关系来补充我的数组,它应该只选择选择性字段
以下查询工作正常:
$q = $em->createQuery("select "
. "partial t.{id, description}, "
. "partial ut.{id, firstName, lastName, email}, "
. "DATE_FORMAT(ut.created, '%m-%d-Y') "
. "from PMIUserBundle:Task t LEFT JOIN t.users ut");
DATE_FORMAT(ut.created, '%m-%d-Y') 在非部分时工作正常。
DATE_FORMAT
已在 config.yml 中注册为自定义函数
配置文件:
dql:
datetime_functions:
DATE_FORMAT: PMI\UserBundle\DoctrineFunctions\DateFormat
以下查询会产生问题:
$q = $em->createQuery("select "
. "partial t.{id, description}, "
. "partial ut.{id, firstName, lastName, email, DATE_FORMAT(created, '%m-%d-Y')}, "
. "DATE_FORMAT(ut.created, '%m-%d-Y') "
. "from PMIUserBundle:Task t LEFT JOIN t.users ut");
给出错误:
[Syntax Error] line 0, col 91: Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_CURLY_BRACE, got '('
以下是我的 DateFormat 类:
class DateFormat extends \Doctrine\ORM\Query\AST\Functions\FunctionNode {
protected $dateExpression;
protected $formatChar;
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) {
return 'DATE_FORMAT('.
$sqlWalker->walkArithmeticExpression($this->dateExpression) .
','.
$sqlWalker->walkStringPrimary($this->formatChar).
')';
}
public function parse(\Doctrine\ORM\Query\Parser $parser) {
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
$this->dateExpression = $parser->ArithmeticExpression();
$parser->match(Lexer::T_COMMA);
$this->formatChar = $parser->StringPrimary();
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
}
编辑:
好的,所以 Partial 不允许我使用 DQL 函数。感谢FuzzyTree在我的实体类中使用 ut->getFormattedCreatedDate()
的解决方案。但我仍然很好奇,如果我们对子表进行分组并使用 mysql 聚合函数计算一些数量会怎样。
如何使用 createQuery、queryBuilder、nativeSQl 或任何其他方式在 doctrine2 中实现以下标准:
- 仅选择选择性字段
- 使用聚合函数按子表实体分组
- Hydrate 数组基于表关系,聚合函数结果 应该在子数组中。
每次如果我们使用 DQL 函数,我们是否必须像我为 DateFormat 创建的那样创建类?如果我们使用像
这样的嵌套 MySql 函数怎么办GROUP_CONCAT(DISTINCT CONCAT(tags.id,',',tags.displayName)
感谢您阅读我的问题。
最佳答案
How do you use custom DQL functions in partials to hydrate query result.
partial
关键字告诉 doctrine 返回仅部分水合的实体,并允许您指定要水合的字段。
当检索部分实体时,您只能选择实体的字段(因为否则学说会在哪里“存储”您选择的字段?),因此不可能将 DQL 函数指定为部分实体的字段对象。
关于php - doctrine2 中的自定义 DQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24799971/