Select z N:M tabuľky, zoskupenie podľa 1 stĺpca a ako druhý stĺpec vrátiť pole (array)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Lkopo
Člen | 65
+
0
-

Zdravím,

mám tabuľku user_role:

| user_id | role_id |

kde role_id má FK na stĺpec id tabuľky role:

| id | name | level |

user_id FK nemá, keďže sa odkazuje na usera z inej databázy.

Čo ale chcem dosiahnúť je, že by som selectom z tabuľky user_role vytiahol všetkých userov a zbavil sa duplikátov (group by) avšak ale potrebujem získať ako druhý stĺpec pole všetkých rolí pre daného usera.

Príklad takej tabuľky v databáze:

| user_id | role_id |
|---------|---------|
|   1     |    10   |
|   1     |     9   |
|   2     |     9   |

A očakaváná forma výsledku zo selectu:

| user_id |    role_id   |
|---------|--------------|
|   1     | array(10, 9) |
|   2     | array(9)     |

Je možné takéto niečo dosiahnúť cez Nette\Database\Table\Selection alebo je nutné robiť 2 osobitné selekcie – prvá vyberie všetkých userov a druhá k ním vráti výpis rol? Vopred díky.

Editoval Lkopo (10. 3. 2017 13:05)

David Matějka
Moderator | 6445
+
0
-

tak primo pole z db nevratis, ale kdyz jsou to jen takhle ID, tak nebude problem pres group_concat to treba spojit carkoua a v php to explodnout do pole

Lkopo
Člen | 65
+
0
-

Aha, no to sa mi potom neoplatí, keďže mi to naruší referenciu na tabuľku role a následovne by som bol nútený aj tak robiť osobitný select pre každú rolu. Tak sa vydám teda tou alternatívnou cestou, ale aj tak vďaka :)

GEpic
Člen | 566
+
0
-

Mě se nelíbí, že role_id je reference a ty si chceš nechat vrátit něco, co není pravda (pole). Navíc když máš jednoduchý level-like ACL.

Editoval GEpic (10. 3. 2017 13:33)

Lkopo
Člen | 65
+
0
-

No to bol hrubý náčrt, presnešie som chcel nechať vrátiť pole referencií.

CZechBoY
Člen | 3608
+
0
-

Prostě selectni všechny usery a role a přes fetchAssoc si udělej strukturu jakou potřebuješ.