2015-10-15 29 views
0

我有2个实体:客户端和用户。用户可以分配给客户端(多对多;一个用户可以管理多个客户端,客户端可以由多个用户管理)。在我的应用程序中,我有客户名单。有没有一种方法可以使用Doctrine在列表顶部显示未分配用户的客户端?或者我应该只使用findAll()并在PHP中进行排序?通过空ArrayCollection对实体排序?

编辑:所以基本上,通过创建@ORM \ ManyToMany关系,我在MySQL中有3个表:客户端,用户和clients_of_users(与client_id和user_id列)。使用普通的SQL:

SELECT c.id, c.name, c.surname, COUNT(cof.user_id) as `Number of Users` 
FROM clients c 
LEFT JOIN clients_of_users cof ON c.id = cof.client_id 
GROUP BY c.id 
ORDER BY `Number of Users` ASC 

与此查询我得到的结果:

1 Name1 Surname1 0 
6 Name6 Surname6 0 
5 Name5 Surname5 1 
7 Name7 Surname7 1 
3 Name3 Surname3 2 
4 Name4 Surname4 3 
2 Name2 Surname2 4 

所以耶!我有没有用户的客户。最后,我想有这个名单由客户端编号的顺序排列,但仍与客户端,而在顶部的用户,这样的结果是这样的:

1 Name1 Surname1 0 
6 Name6 Surname6 0 
2 Name2 Surname2 4 
3 Name3 Surname3 2 
4 Name4 Surname4 3 
5 Name5 Surname5 1 
7 Name7 Surname7 1 

所以,这一切我想使用的Symfony2 /学说的方式来实现。这可能吗?

+0

的findAll()和排序在PHP中不再支持大型数据库。使用你的repo建立一个查询生成器 – rommct

+0

使用这个查询存储库的所有对象,并以DES命令的名称进行排序$ repo-> findBy(array(),array('name','DESC');' – Matteo

回答

0

如果我理解你,那么这是一个非常基本的问题。您应该添加一个ClientRepository类并在查询中添加使用ORDER BY的自定义函数。您可以使用DQL或使用querybuilder构建此查询。一个关闭的例子可以找到here

2

应该可以直接在您的存储库的具体方法:

public function findClientOrderedByUser() 
{ 
    $qb = $this->createQueryBuilder('c') 
        ->select('c') 

        /***/ 

        ->orderBy('c.user', 'DESC'); 


    return $qb->getQuery()->getResult(); 
} 

希望它可以帮助你

+0

不幸的是在我的问题中写到这是多对多关系,所以在Client实体中,我保护了$ users,并且在User实体中,我保护了$ clients - 都在__construct()方法中定义当我使用你的方法时,我收到错误:QueryException:[语义错误] line 0,col 56'users DESC'附近:Error:Invalid PathExpression。StateFieldPathExpression or SingleValuedAssociationField expected。 –

+0

When I am使用此查询:'SELECT c FROM Client c JOIN c.users u'我正在接收分配有用户的客户列表,但我想要的是所有客户列表,其中没有分配用户的列表位于列表的顶部。 –

相关问题