MySQLテーブルにフィールドfirstname
とlastname
があります。便宜上、計算列を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と同じ動作を実現するにはどうすればよいですか?
どうやら、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")
問題を解決しました
これは私のために働きます:
$builder->select([
'customer.id as id',
'customer.number as number',
'CONCAT(CONCAT(customer.firstname, \' \'), customer.lastname) as 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プラットフォーム。
クレイグ