web-dev-qa-db-ja.com

Doctrine 2 DQLCONCATフィールドと定数文字列

MySQLテーブルにフィールドfirstnamelastnameがあります。便宜上、計算列をfull_nameという名前のDoctrine 2エンティティに追加したいと思います。昔ながらの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と同じ動作を実現するにはどうすればよいですか?

7
Subsurf

どうやら、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")

問題を解決しました

30
Subsurf

これは私のために働きます:

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

私が使用するソリューション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プラットフォーム。

クレイグ

0
Craig Rayner