Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Wyciąganie danych z tabel many-to-many
parzol
post 28.02.2017, 10:46:12
Post #1





Grupa: Zarejestrowani
Postów: 135
Pomógł: 1
Dołączył: 7.05.2005

Ostrzeżenie: (0%)
-----


  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
Go to the top of the page
+Quote Post
nospor
post 28.02.2017, 10:49:08
Post #2





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




select * from users
left join roles_users ...
left join roles ....


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
viking
post 28.02.2017, 10:59:19
Post #3





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


A po co ci w zasadzie tabela roles_users? ja bym dał od razu role_id w users.


--------------------
Go to the top of the page
+Quote Post
nospor
post 28.02.2017, 11:01:16
Post #4





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




@viking pewnie cie zaskocze, ale czasami dobrze jest, by user mogl nalezec do kilku rol a nie tylko jednej wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
viking
post 28.02.2017, 11:14:40
Post #5





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
nospor
post 28.02.2017, 11:16:35
Post #6





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




Nie wiem jakie parzol ma wymagania. Wiem natomiast ze uzywa Kohana i struktura tabel jaka ma zostala narzucona przez modul Auth smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
parzol
post 28.02.2017, 13:10:04
Post #7





Grupa: Zarejestrowani
Postów: 135
Pomógł: 1
Dołączył: 7.05.2005

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
phpion
post 1.03.2017, 08:12:33
Post #8





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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ć.
Go to the top of the page
+Quote Post
parzol
post 1.03.2017, 08:38:20
Post #9





Grupa: Zarejestrowani
Postów: 135
Pomógł: 1
Dołączył: 7.05.2005

Ostrzeżenie: (0%)
-----


phpion - jak zwykle rządzisz! Lkingsmiley.png
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 03:13