Doctrine 2 DQL CONCAT字段和常量字符串

时间:2016-01-12 23:09:41

标签: mysql string doctrine-orm concat

我的MySQL表中有firstnamelastname字段。为方便起见,我想在我的Doctrine 2实体中添加一个名为full_name的计算列。在普通的MySQL中我会做这样的事情

SELECT CONCAT(firstname, " ", lastname) AS full_name FROM customers;

但是,连接字段和常量字符串(""在这种情况下)似乎不适用于Doctrine的CONCAT实现。使用以下代码时

$repository
    ->createQueryBuilder('customer')
    ->select('CONCAT(customer.firstname, " ", customer.lastname) AS full_name')
    // ...

我收到错误

[Syntax Error] line 0, col 91: Error: Expected StateFieldPathExpression | string | InputParameter | FunctionsReturningStrings | AggregateExpression, got '"'

如何实现与MySQL相同的行为?

3 个答案:

答案 0 :(得分:23)

显然,DQL中的字符串只能用单引号封装,而不能用双引号封装。文档中的简短搜索并未直接提及此行为,但我注意到所有包含常量字符串的示例都使用单引号。

更改

->select('CONCAT(customer.firstname, " ", customer.lastname) AS full_name')

->select('CONCAT(customer.firstname, \' \', customer.lastname) AS full_name')

->select("CONCAT(customer.firstname, ' ', customer.lastname) AS full_name")

解决了问题

答案 1 :(得分:1)

这对我有用:

$builder->select([
   'customer.id as id',
   'customer.number as number',
   'CONCAT(CONCAT(customer.firstname, \' \'), customer.lastname) as name'
]);

答案 2 :(得分:0)

我在Doctrine 2.4 +中使用的解决方案:

$concat = new Query\Expr\Func('CONCAT', $name[$k]);
$concat .= ' as ' . $k;
$concat = str_replace(',', ',\' \',', $concat);
$this->query->addSelect($concat);

所以$ name [$ k]是一个字段数组,尽可能多。然后我用str_replace在字段之间添加一些间距。 $ k是concat字段的名称,因此$ concat的结果是

"CONCAT(p.email,' ', h.phoneNumber,' ', p.officialName) as details"

希望这有助于某人。在MySQL数据库PDO平台上。

克雷格