【问题标题】:Symfony DQL - transform the array query resultSymfony DQL - 转换数组查询结果
【发布时间】:2015-02-12 16:54:12
【问题描述】:

我正在尝试转换我的查询结果数组。

首先我做了这个查询:

public function findAllTraduction()
{
    return $this->createQueryBuilder('c')
        ->select('c.key, c.content, c.id, f.locale')
        ->leftJoin('c.TraductionFile', 'f')
        ->groupBy('c.key')
        ->getQuery()
        ->getArrayResult();
}

结果是这样的:

array 
  0 => 
    array 
      'key' => string 'FORMAT1' 
      'content' => string 'login'
      'id' => int 507
      'locale' => string 'en'
  1 => 
    array 
      'key' => string 'FORMAT1'
      'content' => string 'connecter' 
      'id' => int 508
      'locale' => string 'fr' 
  2 => 
    array
      'key' => string 'FORMAT2' 
      'content' => string 'password' 
      'id' => int 503
      'locale' => string 'en' 
  3 => 
    array 
      'key' => string 'FORMAT2' 
      'content' => string 'mot de passe'
      'id' => int 504
      'locale' => string 'fr' 

我想要的是一个这样的数组:

array
  'FORMAT1' => 
    array
      'en' =>
        array
          'content' => string 'login'
          'id' => int 507
      'fr' =>
        array
          'content' => string 'connecter'
          'id' => int 508
  'FORMAT2' => 
    array
      'en' =>
        array
          'content' => string 'password'
          'id' => int 503
      'fr' =>
        array
          'content' => string 'mot de passe'
          'id' => int 504

实际上,对于每个相同的'key'(这里是'FORMAT1''FORMAT2',由'locale'ENFR)重新组合

是否可以在查询中做到这一点?

我尝试使用 GROUPBY 和 DISTINCT,但什么也没发生...

如果无法查询,可以用循环重绘数组......

谢谢!

【问题讨论】:

    标签: sql symfony dql


    【解决方案1】:

    Doctrine 提供了一种在创建 QueryBuilder 时指定 indexBy 的方法,以便不按顺序索引结果数组,而是按特定键:

    createQueryBuilder($alias, $indexBy = null)
    

    所以你可能想尝试类似createQueryBuilder('c', 'c.key') 来使用 c 键作为数组索引

    【讨论】:

      【解决方案2】:

      我找到了使用 foreach 重绘数组的解决方案...

      $catalogue = [];
      
              foreach ($catalogues_array as $index => $val) {
                  $key = $val['key'];
                  $locale = $val['locale'];
                  unset($catalogues_array[$index]['key']);
                  unset($catalogues_array[$index]['locale']);
                  $catalogue[$key][$locale] = $catalogues_array[$index];
              }
              return $catalogue;
      

      结果:

      array (size=421)
        'base_template.page_title' => 
          array (size=2)
            'en' => 
              array (size=6)
                'content' => string 'Audio Video Caption - Subtitling & Transcription of media.' (length=58)
                'description' => null
                'traductionControle' => boolean false
                'id' => int 1
                'domain' => string 'messages' (length=8)
                'bundleName' => string 'app' (length=3)
            'fr' => 
              array (size=6)
                'content' => string 'Audio Video Caption - Sous-Titrage & Transcription de médias.' (length=62)
                'description' => null
                'traductionControle' => boolean false
                'id' => int 9
                'domain' => string 'messages' (length=8)
                'bundleName' => string 'app' (length=3)
        'base_template.meta.keywords' => 
          array (size=2)
            'en' => 
              array (size=6)
                'content' => string 'closed captioning, subtitle, speech recognition, transcription, traduction, video, audio' (length=88)
                'description' => null
                'traductionControle' => boolean false
                'id' => int 2
                'domain' => string 'messages' (length=8)
                'bundleName' => string 'app' (length=3)
            'fr' => 
              array (size=6)
                'content' => string 'sous-titre, reconnaissance vocale, transcription, traduction, video, audio' (length=74)
                'description' => null
                'traductionControle' => boolean false
                'id' => int 10
                'domain' => string 'messages' (length=8)
                'bundleName' => string 'app' (length=3)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-14
        相关资源
        最近更新 更多