postgres sql 9.3 string_agg函数不适用于PHP

时间:2015-07-22 00:46:36

标签: php postgresql laravel string-aggregation

我有这组表:

用户表:

id    username
 1      user

分组表:

id    name
 1     g1
 2     g2

users_groups表:

user_id    group_id
   1          1
   1          2

我希望得到这个结果:

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
  • apache 2
  • windows 7
  • laravel 5.0

1 个答案:

答案 0 :(得分:1)

除了GROUP BY上缺少users.username之外,查询没有任何问题,因此问题可能出在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(或任何其他框架)实际可能的选项。并且您可以将所有复杂查询集中在一个位置(数据库),从而使安全性分析和维护变得更加容易。