Doctrine不会让我选择特定的字段

Яро*_*лин 10 dql symfony doctrine-orm

symfony框架具有app/console文件,可以通过php执行以执行一些维护任务.它还允许用户运行DQL查询:

# php app/console doctrine:query:dql --hydrate=array \
    'SELECT u.id, u.nameFirst, u.nameLast  FROM DatabaseBundle:User u'  
array
  0 => 
    array
      'id' => string '1' (length=1)
      'nameFirst' => string 'jaroslav' (length=8)
      'nameLast' => string 'rakhmatoullin' (length=13)
  1 => 
    array
      'id' => string '2' (length=1)
      'nameFirst' => string 'Båb Kåre' (length=10)
      'nameLast' => string 'Ytrefoss' (length=8)
Run Code Online (Sandbox Code Playgroud)

观察我选择了三个特定的列.我遇到的问题是,当两个表连接时,类似的查询会给我一个错误.

# php app/console doctrine:query:dql  --hydrate=array \
    'SELECT u.id , r FROM DatabaseBundle:User u JOIN u.roles r'

  [Doctrine\ORM\Query\QueryException]                   
  [Semantical Error] line 0, col -1 near 'SELECT u.id ,': 
     Error: Cannot select entity through identification variables 
     without choosing at least one root entity alias.  
Run Code Online (Sandbox Code Playgroud)

以下内容返回与其角色一起加入的整个用户:

# php app/console doctrine:query:dql  --hydrate=array \
     'SELECT u, r FROM DatabaseBundle:User u JOIN u.roles r'
Run Code Online (Sandbox Code Playgroud)

显然,我错过了一些东西.

有任何想法吗?我也很感激链接到适当的文档(关于这个具体问题).

Яро*_*лин 31

"部分对象语法"文档:

默认情况下,当您在Doctrine中运行DQL查询并仅为给定实体选择字段的子集时,您不会再接收对象.相反,您只接收数组作为扁平矩形结果集,类似于您直接使用SQL并加入某些数据时的方式.

如果要选择部分对象,可以使用部分 DQL关键字.

php console doctrine:query:dql --hydrate array \
   'SELECT partial s.{name ,id}, partial c.{name, id } 
    FROM DatabaseBundle:ProductCategories c 
    JOIN c.suppliers s ORDER BY s.name, c.name'
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您必须在部分查询中包含主键 - 否则会出现严重错误。 (4认同)
  • 两年后,我不太明白我自己的答案,但如果我没记错,关键是:每个产品类别都映射为"c",每个category.supplier []映射为s.每个类别都有供应商通过ProductCategories类中的"@annotated-join"进行映射.感谢所有的选票.我认为10就足够了. (2认同)