みなさんこんにちは。
私が現在取り組んでいるプロジェクトでは、GROUP_CONCAT()関数を使用する必要がありました。 あいにく、Doctrine2はそのままではこの機能をサポートしていません。 Doctrine2開発者の1人(Benjamin Eberlei)から
の既存の拡張は「GROUP_CONCATの限定サポート」としてリストされています。 この関数を使用すると、プロジェクトが自動的にMySQLに依存することを理解していますが、DBMSをグローブとして変更する予定はありません。 この質問を投稿の範囲外にしましょう。
グーグルで既製のソリューションを見つけられなかったので、私はそれを自分で書くことにしました(ベンジャミンの開発を基礎として)。 コメントする特別なものはありませんので、試用のために公開するだけです。
namespace DoctrineExtensions\Query\Mysql; use Doctrine\ORM\Query\AST\Functions\FunctionNode, Doctrine\ORM\Query\Lexer; class GroupConcat extends FunctionNode { public $isDistinct = false; public $pathExp = null; public $separator = null; public $orderBy = null; public function parse(\Doctrine\ORM\Query\Parser $parser) { $parser->match(Lexer::T_IDENTIFIER); $parser->match(Lexer::T_OPEN_PARENTHESIS); $lexer = $parser->getLexer(); if ($lexer->isNextToken(Lexer::T_DISTINCT)) { $parser->match(Lexer::T_DISTINCT); $this->isDistinct = true; }
使用例:
$query = $this->createQueryBuilder('c') ->select(" c as company, GroupConcat(b.id, ';', b.headOffice, ';', b.city, ';', s.name ORDER by b.id SEPARATOR '|') AS branches ")->leftJoin('c.branches','b') ->leftJoin('b.country','s') ->groupBy('c.id') ->setFirstResult(0) ->setMaxResults(10) ->getQuery() ; $result = $query->getResult();
トピックに関する公式ドキュメント:
Doctrine2にカスタムDQL関数を登録します 。
Symfony2でカスタムDQL関数に接続する方法 。
MySQL関数GROUP_CONCATの説明 。