2015-07-22 23 views
0

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

回答

1
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