2015-12-03 50 views
3

誰知道如何解決這個簡單的問題? 我有實體項目與領域喜歡用戶和樹枝計數這個領域,但我想這個計數(DESC)訂單項目 - 首先誰擁有更多的用戶喜歡。怎麼做?在查詢生成器或在樹枝創建過濾器?幫助教條我知道計數Symfony按字段排序實體OneToMany

"likes_user" => count($this->getLikedUsers()->getValues()) 

如何排序我的這個領域的所有項目?

或如何用查詢生成器解決它? 類似的東西,但是這是不行的:

public function getProjects() 
{ 
    $qb = $this->getEntityManager()->createQueryBuilder('d'); 
    $qb 
     ->select('d') 
     ->from('AppBundle:Project', 'd') 
     ->where('d.confirm = :identifier') 
     ->setParameter('identifier', 'approved') 
     ->orderBy('COUNT(d.likedUsers)', 'DESC') 
     ->getQuery() 
     ->getResult() 
    ; 
    $query = $qb->getQuery(); 
    $results = $query->getResult(); 
    return $results; 
} 

實體:

/** 
* Project 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="AppBundle\Entity\ProjectRepository") 
*/ 
class Project implements \JsonSerializable 
{ 
    /** 
    * @var Collection 
    * 
    * @ORM\OneToMany(targetEntity="AppBundle\Entity\User", mappedBy="likedProjects") 
    */ 
    private $likedUsers; 




{% for project in projects %} 
<div>LIked: <span>{{ project.likedUsers|length|number_format(0, '.', ' ') }}</span></div> 
{% endfor %} 

我想,也許這樣的:

{% for project in projects.likedUsers|length|sort %} 

但不影響
也許誰知道?數組項目如何按字段LikedUser的數量進行排序。我不知道這是怎麼回事。查詢生成器或樹枝擴展或usort ..

回答

0

恕我直言,這似乎是PHP而不是Doctrine的工作。不確定是否可以通過Doctrine實現t,如果可能的話,會有什麼影響。

一種方法是usort()

$projects = ...; 
usort($projects, function($p1, $p2){ 
    // Both $p1 and $p2 are instance of Project 
    // Assuming that `getLikedUsers()` return Doctrine `Collection`... 

    return count($p1->getLikedUsers()) > count($p2->getLikedUsers()); 
}); 

usort以一個數組並在每個通提供了兩個項目(兩個項目在你的情況),你來決定哪一個是「大」。就你而言,擁有更多喜歡的項目肯定是「更大」的,對吧?

希望這會有所幫助...

+0

更新我的問題。我不明白$ p1,$ p2和size()是什麼?也許計數($ project-> getLikedUser() - > getValues())或我不明白 –

+0

如果我得到這個權利,你有一個*項目列表*,你需要通過計數「喜歡用戶」。那是對的嗎? –

+0

是的這是正確的 –

0

我用查詢生成器解決了。而我只添加項目誰喜歡用戶 - 用戶住在一些城市沒有所有城市

public function getProject() 
{ 
    $qb = $this->getEntityManager()->createQueryBuilder('d'); 
    $qb 
     ->select('d') 
     ->from('AppBundle:Project', 'd') 
     ->addSelect('COUNT(m.id) as nMethods') 
     ->join('d.likedUsers', 'm') 
     ->join('m.location', 'l') 
     ->where('l.city = :identifier') 
     ->setParameter('identifier', 'someCity') 
     ->groupBy('d.id') 
     ->orderBy("nMethods", 'DESC') 

     ->getQuery() 
     ->getResult() 
    ; 
    $query = $qb->getQuery(); 
    $results = $query->getResult(); 
    return $results; 
}