【发布时间】:2014-09-08 02:44:20
【问题描述】:
如何在部分中使用自定义 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 中注册为自定义函数
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 或任何其他方式在学说 2 中实现以下条件:
- 仅选择选择性字段
- 使用聚合函数按子表实体分组
- 基于表关系的水合物数组,聚合函数结果 应该在子数组中。
每次如果我们使用 DQL 函数,我们是否必须像我为 DateFormat 创建的那样创建类?如果我们使用嵌套的 MySql 函数,比如
GROUP_CONCAT(DISTINCT CONCAT(tags.id,',',tags.displayName)
感谢您阅读我的问题。
【问题讨论】:
标签: php mysql symfony doctrine-orm php-5.4