2016-12-28 62 views
0

排序我有两块彼此相关型号:Symfony的3 /学说:由非持久性列

class Product 
{ 
    //... 

    /** 
    * @var Collection<Key> 
    * One Product has Many Keys. 
    * @ORM\OneToMany(targetEntity="Key", mappedBy="product") 
    */ 
    private $keys; 

    public function getKeyNumber() 
    { 
     return count($this->keys); 
    } 

    //... 
} 

class Key 
{ 
    //... 

    /** 
    * @var Product 
    * 
    * Many Keys have One Product. 
    * @ORM\ManyToOne(targetEntity="Product", inversedBy="keys") 
    * @ORM\JoinColumn(referencedColumnName="id") 
    */ 
    private $product; 

    /** 
    * @var int 
    * @ORM\Column(type="integer") 
    */ 
    private $product_id; 

    //... 
} 

我能够拿到钥匙的数量与Product::getKeyNumber()。现在我想在查询中使用这个值进行排序。

我已经试过类似的东西(DQL查询):

SELECT a, COUNT(a.keys) AS keyNumber FROM AppBundle\Entity\Product a ORDER BY keyNumber ASC; 

返回:

[Semantical Error] line 0, col 18 near 'keys) AS keyNumber': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected. 

当我尝试:

SELECT a FROM AppBundle\Entity\Product a ORDER BY count(a.keys) ASC 

它说:

[Syntax Error] line 0, col 50: Error: Expected known function, got 'count' 

任何想法? :)

谢谢。

回答

1

你可以试试只要COUNT()做这样的事情(只是一个想法,而不是验证码)

SELECT a, COUNT(b.id) AS keyNumber FROM AppBundle:Product a JOIN a.keys b ORDER BY keyNumber ASC; 

预计单值字段,你可以明确地加入键表,并在它的东西算(我认为它有ID,或者你可以使用任何有)。

+0

似乎工作,我只需要添加'GROUP BY a.id'。 ;)这是DQL查询我结束了:'选择一个,COUNT(b.id)AS keyNumber FROM的appbundle:产品一INNER JOIN a.keys B组BY a.id ORDER BY keyNumber ASC'。由于一些奇怪的原因,这是行不通的:'SELECT a FROM AppBundle:Product a INNER JOIN a.keys b GROUP BY a.id ORDER BY COUNT(b.id)ASC' – saitho

+0

我很高兴它为你工作。 DQL不像SQL那么先进,所以我认为order by子句中的函数没有实现(还没有?)。 – Stepashka

0

我不知道它是否与组合键有关?我读了一些关于此的内容。我不知道你的关键标识符是什么,但我在下面显示a.id。你可以试试这个:

SELECT IDENTITY(a.id), a, COUNT(a.keys) AS keyNumber FROM AppBundle:Product a ORDER BY keyNumber ASC 

注意,我已经减少的appbundle \实体\产品简单的appbundle:产品和摆脱末尾的分号。

让我知道,如果这有效,它可能不会。

+0

不,不行。 :/'[语义错误] 0行,列18附近 'ID)中,a,COUNT(a.keys)':错误:无效PathExpression。必须是SingleValuedAssociationField.'但谢谢你的回答。 :) – saitho