Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Wyciąganie danych z tabel many-to-many
Forum PHP.pl > Forum > Bazy danych > MySQL
parzol
  1. CREATE TABLE IF NOT EXISTS `roles` (
  2. `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `name` varchar(32) NOT NULL,
  4. `description` varchar(255) NOT NULL,
  5. PRIMARY KEY (`id`),
  6. UNIQUE KEY `uniq_name` (`name`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  8.  
  9. CREATE TABLE IF NOT EXISTS `roles_users` (
  10. `user_id` int(10) UNSIGNED NOT NULL,
  11. `role_id` int(10) UNSIGNED NOT NULL,
  12. PRIMARY KEY (`user_id`,`role_id`),
  13. KEY `fk_role_id` (`role_id`)
  14. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  15.  
  16. CREATE TABLE IF NOT EXISTS `users` (
  17. `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  18. `email` varchar(127) NOT NULL,
  19. `username` varchar(32) NOT NULL DEFAULT '',
  20. `password` varchar(64) NOT NULL,
  21. `logins` int(10) UNSIGNED NOT NULL DEFAULT '0',
  22. `last_login` int(10) UNSIGNED,
  23. PRIMARY KEY (`id`),
  24. UNIQUE KEY `uniq_username` (`username`),
  25. UNIQUE KEY `uniq_email` (`email`)
  26. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Jak wyciągnąć możliwie w jednym zapytanie listę użytkowników wraz ze wszystkimi ich rolami? closedeyes.gif
nospor
select * from users
left join roles_users ...
left join roles ....
viking
A po co ci w zasadzie tabela roles_users? ja bym dał od razu role_id w users.
nospor
@viking pewnie cie zaskocze, ale czasami dobrze jest, by user mogl nalezec do kilku rol a nie tylko jednej wink.gif
viking
Zgadza się, ale w większości przypadków wystarcza dobrze rozplanowana ACLka z dziedziczeniem ról (którego to w tabeli nie widać). Ale to tylko strzelam bo może faktycznie takie są wymagania jak mówisz.
nospor
Nie wiem jakie parzol ma wymagania. Wiem natomiast ze uzywa Kohana i struktura tabel jaka ma zostala narzucona przez modul Auth smile.gif
parzol
Cytat(nospor @ 28.02.2017, 11:16:35 ) *
Nie wiem jakie parzol ma wymagania. Wiem natomiast ze uzywa Kohana i struktura tabel jaka ma zostala narzucona przez modul Auth smile.gif


Dokładnie. Tabele zostały narzucone i nie chcę tego zmieniać. Nie dyskutowałbym na temat zasadności.

Aktualnie moje zapytanie wygląda więc tak:

  1. $sql = DB::select()
  2. ->from($this->_table_name)
  3. ->join('roles_users')->on('users.id', '=', 'roles_users.user_id')
  4. ->join('roles')->on('roles_users.role_id', '=', 'roles.id')
  5. ->execute();


Jak z tego mogę wyciągnąć Role?
phpion
W zasadzie zapytanie, które zbudowałeś, wyciąga to co oczekujesz, tj. wszystkich użytkowników wraz z ich rolami. Dane zwraca w postaci:
Kod
użytkownik1 | rola1
użytkownik1 | rola2
użytkownik1 | rola3
użytkownik2 | rola1

a zapewne oczekiwałbyś np. tak:
Kod
użytkownik1 | rola1, rola2, rola3
użytkownik2 | rola1

Musisz zatem zastosować GROUP_CONCAT oczywiście w połączeniu z GROUP_BY. W Kohanie ogarniesz to w ten sposób.

I na koniec 2 rady:
1. Jawnie podawaj kolumny, które Cię interesują. Twoje zapytanie zwróci przykładowo wartość pod indeksem id. Będzie to identyfikator rekordu. Pytanie tylko z której tabeli: users czy może roles?
2. Pomyśl nad rodzajem złączenia tabel. W przypadku gdy użytkownik nie będzie miał przypisanej żadnej roli nie otrzymasz go w wyniku swojego zapytania. Może aplikacja nie dopuszcza takiej możliwości, ale sama baza już tak więc trzeba to odpowiednio obsłużyć.
parzol
phpion - jak zwykle rządzisz! Lkingsmiley.png
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.