har*_*dik 5 php mysql symfony doctrine-orm php-5.4
如何在partials中使用自定义DQL函数来水合查询结果.
寻找在createQuery或任何其他学说方式(nativeSql,QueryBuilder)中使用DQL函数的方法,它不必使用partials但它应该基于表的关系来保持我的数组,它应该只选择选择性字段
以下查询工作正常:
$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");
Run Code Online (Sandbox Code Playgroud)
DATE_FORMAT(ut.created,'%m-%d-Y')在偏出局部时工作正常.
DATE_FORMAT
已在config.yml中注册为自定义函数
config.yml:
dql:
datetime_functions:
DATE_FORMAT: PMI\UserBundle\DoctrineFunctions\DateFormat
Run Code Online (Sandbox Code Playgroud)
以下查询创建问题:
$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");
Run Code Online (Sandbox Code Playgroud)
给出错误:
[Syntax Error] line 0, col 91: Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_CURLY_BRACE, got '('
Run Code Online (Sandbox Code Playgroud)
以下是我的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);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
好的,所以Partial不允许我使用DQL函数.感谢FuzzyTreeut->getFormattedCreatedDate()
在我的实体类中使用的解决方案.但是我仍然很好奇如果我们将子表分组并使用mysql Aggregate函数计算一些数量.
如何使用createQuery,queryBuilder,nativeSQl或任何其他方式在doctrine2中实现以下条件:
每次如果我们使用DQL函数,我们是否必须像为DateFormat创建的那样创建类?如果我们使用嵌套的MySql函数,该怎么办?
GROUP_CONCAT(DISTINCT CONCAT(tags.id,',',tags.displayName)
Run Code Online (Sandbox Code Playgroud)
感谢您阅读我的问题.
如何在部分中使用自定义 DQL 函数来水合查询结果。
该partial
关键字告诉学说返回仅部分水合的实体,并允许您指定要水合的字段。
检索部分实体时,您只能选择实体的字段(因为否则在哪里“存储”您选择的字段?),因此不可能将 DQL 函数指定为部分对象的字段。