22

「場所」と呼ばれるネストされたセット (Gedmo ツリーを使用) エンティティがあります。エンティティ「アパート」にはlocation_idがあり、「パス」などと呼ばれるスカラー値をすべてのアパートを返すクエリにマップするために必要なものがあります。

Doctrine1 には、次のコードがありました。

/**
* Add "path" to each element
* 
* @param Doctrine_Query $query
* @param string $separator
*/
protected function addScalar_path(Doctrine_Query $query, $separator=", ")
{
    $subquery = "k99.root_id=o.root_id AND k99.lft<=o.lft AND k99.rgt>=o.rgt AND k99.level<=o.level" ;

    $query->addSelect("(SELECT GROUP_CONCAT(k99.name ORDER BY k99.level SEPARATOR '$separator') FROM Location k99 WHERE $subquery) AS path") ;
}

注: "o" エイリアスはプライマリ クエリに使用されます。このコードを使用すると、

{foreach .... as $appartment}
   {$appartment->path}
...

どちらが印刷されますか:

Australia, Victoria, Melbourne, ...other children...

D2で同じことをする方法は? また、私の symfony2 プロジェクトにドクトリン拡張を含めるにはどうすればよいでしょうか?

4

4 に答える 4

34

QueryBuilder で使用する場合は、次のことを行う必要があります。

1) DQL 関数の追加 GroupConcat: GroupConcat

2 ) GroupConcat の登録 : DQL ユーザー定義関数

もう 1 つの方法は、 NativeQuery を使用することです: Native SQL


関数 DQL を登録する symfony2 では、次のように config.yml に GROUP_CONCAT を追加するだけです。

    entity_managers:
        default:
            dql:
                string_functions:
                    GROUP_CONCAT: YourBundle\Query\Mysql\GroupConcat

詳細については、カスタム DQL 関数の登録をご覧ください。

于 2012-06-01T15:03:33.743 に答える
24

この投稿に出くわした場合は、Github にDoctrine Extensionsリポジトリがあります。リポジトリには、使用方法に関する説明があります。composer を使用してインストールし、興味のある機能を使用できます。

編集:

ユーザー Tushar のために、Doctrine2 の DQL で GROUP_CONCAT を使用する方法は、単純にDoctrine Extensionsをインストールすることです:

composer require beberlei/DoctrineExtensions

有効にするには、config.yml に以下を追加します。

doctrine:
 orm:
     dql:
         string_functions:
             group_concat: DoctrineExtensions\Query\Mysql\GroupConcat

次に、コードで、DQL で Group Concat を使用できるようになります。

$this->createQueryBuilder('location')
            ->select('location')
            ->addSelect("GROUP_CONCAT(DISTINCT location.name SEPARATOR '; ') AS locationNames");

        $result = $queryBuilder->getQuery()->getResult();

または、元の質問の場合:

$query->addSelect("(SELECT GROUP_CONCAT(k99.name ORDER BY k99.level SEPARATOR '$separator') FROM Location k99 WHERE $subquery) AS path");
于 2016-04-08T16:00:35.987 に答える
0

同様の問題がありました。GROUP_CONCAT では、内部で CASE-WHEN を使用することはできません。 このライブラリは私の問題を修正したので、役立つかもしれません。

于 2018-06-02T12:39:46.923 に答える