Evenals [MySQL]Kolomnaam is zelf waarde van veld heb ik hier weer een probleem met een veldwaarde die ik in de query zelf wil gebruiken. Ik ben bezig met een RBAC systeem en heb daarvoor de volgende tabellen aangemaakt:
Deze constructie zorgt ervoor dat een gebruiker in een groep terecht komt. De groep krijgt een permissie om een bepaalde actie op een object binnen een domein uit te voeren.
Bijvoorbeeld "gast mag reactie binnen blog aanmaken" en "admin mag gebruiker binnen gebruikers wijzigen".
Omdat ik echter met een modulair systeem werk, wil ik niet één tabel maken met alle objecten die een koppeling krijgen naar het domein. Ik wil alle data van alle plugins gescheiden houden dus heb in dit systeem verzonnen dat in de tabel domains je de tabelnaam van de objecten binnen dat domein kan zetten. Ik heb nu bijvoorbeeld de rijen
1 - blog - blog_objects
2 - user - user_objects
aangemaakt en bijbehorende tabellen user_objects en blog_objects. Die zien er als volgt uit:
Vervolgens wil ik in één query de volgende gegevens ophalen:
Alle permissies die een gebruiker heeft, met "actienaam", "domeinnaam" en "objectnaam".
Ik kom gemakkelijk uit de stap om de eerste twee te achterhalen:
Haal ik me (weer) wat onmogelijks op de hals?
Ik ben niet zo'n sql expert dat ik dergelijke problemen kan oplossen. Het object_id is namelijk niet uniek. De combinatie van object en domein is uniek en je kan de naam van het object achterhalen door bij het id van het domein de juiste tabel op te zoeken.
Het lijkt me niet verstandig om uiteindelijk bij een gebruiker de tientallen combinaties van domein_id en object_id te gaan zoeken in aparte queries, want dat nekt echt de performance.
En wederom is het Googlen niet heel makkelijk, doordat de termen te pas en te onpas worden gebruikt en mijn probleem niet naar voren komt
[b]users[/] id (int) name (varchar) [b]groups[/] id (int) name (varchar) [b]user_in_groups[/] group_id (int) user_id (int) [b]actions[/] id (int) name (varchar) [b]domains[/] id (int) name (varchar) object_table (varchar) [b]permissions[/] id (int) domain_id (int) object_id (int) group_id (int) action_id (int)
Bijvoorbeeld "gast mag reactie binnen blog aanmaken" en "admin mag gebruiker binnen gebruikers wijzigen".
Omdat ik echter met een modulair systeem werk, wil ik niet één tabel maken met alle objecten die een koppeling krijgen naar het domein. Ik wil alle data van alle plugins gescheiden houden dus heb in dit systeem verzonnen dat in de tabel domains je de tabelnaam van de objecten binnen dat domein kan zetten. Ik heb nu bijvoorbeeld de rijen
1 - blog - blog_objects
2 - user - user_objects
aangemaakt en bijbehorende tabellen user_objects en blog_objects. Die zien er als volgt uit:
[b]object_table_X[/] id (int) name (varchar)
Alle permissies die een gebruiker heeft, met "actienaam", "domeinnaam" en "objectnaam".
Ik kom gemakkelijk uit de stap om de eerste twee te achterhalen:
SQL:
Hier blijf ik dus vastzitten in de objectnaam. Die kan ik uit domains.object_table halen waarbij je dus in (domains.object_table).name de waarde van het object krijgt.1
2
3
4
5
6
7
| SELECT a.name action, d.name domain, p.object_id object FROM permissions p LEFT JOIN actions a ON p.action_id = a.id LEFT JOIN groups g ON p.group_id = g.id LEFT JOIN domains d ON p.domain_id = d.id LEFT JOIN user_in_groups u ON u.group_id = g.id WHERE u.user_id =1 |
Haal ik me (weer) wat onmogelijks op de hals?
Het lijkt me niet verstandig om uiteindelijk bij een gebruiker de tientallen combinaties van domein_id en object_id te gaan zoeken in aparte queries, want dat nekt echt de performance.
En wederom is het Googlen niet heel makkelijk, doordat de termen te pas en te onpas worden gebruikt en mijn probleem niet naar voren komt