的Postgres的sql不工作的PHP

问题描述:

9.3 string_agg功能我有这样的一组表:的Postgres的sql不工作的PHP

用户表:

id username 
1  user 

组表:

id name 
1  g1 
2  g2 

users_groups表:

user_id group_id 
    1   1 
    1   2 

我想获得这个r esult:

id username user_groups 
1  user   g1,g2 

我发现,使用string_agg可以解决这个问题,而且它确实Postgres的控制台上,但是当我用PHP相同的查询,我得到这个消息

SQLSTATE[HY000]: General error: 1 no such function: string_agg 

这里是我的查询:

select users.id, users.username, string_agg(groups.name, ', ') 
from users 
inner join users_groups on users.id = users_groups.user_id 
inner join groups on groups.id = users_groups.group_id 
group by users.id 

由我使用的方式:

  • 的PostgreSQL-9.3
  • PHP 5.6.0
  • 阿帕奇2
  • Windows 7的
  • laravel 5.0
+0

首先,你应该'GROUP BY users.id,users.username'。什么是'groups.name'列的数据类型? – Patrick

+0

你可以显示php代码吗? – Renzo

+0

@Patrick我没有'group by users.username'没有任何变化,'groups.name'是varchar – yazfield

users.username失踪 GROUP BY

除了没有什么错的查询,所以这个问题可能在PHP方面。一个解决方案,可能的工作是把你的查询到一个视图,然后调用从PHP:

CREATE VIEW users_with_groups AS 
    SELECT users.id, users.username, string_agg(groups.name, ', ') AS groups 
    FROM users 
    JOIN users_groups ON users.id = users_groups.user_id 
    JOIN groups ON groups.id = users_groups.group_id 
    GROUP BY users.id, users.username; 

你的PHP代码现在变成一个相当简单的DB::table('users_with_groups')->select,而不是你现在有复杂的语句。 (请注意,在SQL中VIEW就像一个“虚拟”的表,你可以将所有的操作就可以了,就像在常规表。)

这种方法一般一个好主意:PostgreSQL没有SELECT更多的选择语句比PHP(或其他任何框架)实际可行的语句更多。而且你将所有复杂的查询集中到一个地方(数据库),使安全性分析和维护变得更加容易。

+0

是的,我认为这是在PHP方面,但仍不知道是什么问题,我会继续寻找。 一个视图是避免这个问题的一个好主意,它让我的思想滑落了,谢谢@Patrick – yazfield