Doctrine 2 DQL CONCAT 字段和常量字符串
Doctrine 2 DQL CONCAT fields and constant strings
我的 MySQL table 中有字段 firstname
和 lastname
。为了方便起见,我想在我的 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 相同的行为?
显然,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")
解决了问题
我在 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 平台上。
克雷格
这对我有用:
$builder->select([
'customer.id as id',
'customer.number as number',
'CONCAT(CONCAT(customer.firstname, \' \'), customer.lastname) as name'
]);
我的 MySQL table 中有字段 firstname
和 lastname
。为了方便起见,我想在我的 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 相同的行为?
显然,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")
解决了问题
我在 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 平台上。
克雷格
这对我有用:
$builder->select([
'customer.id as id',
'customer.number as number',
'CONCAT(CONCAT(customer.firstname, \' \'), customer.lastname) as name'
]);