Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak stworzyc obiekt adekwatny do laczonej bazy danych.
Forum PHP.pl > Forum > PHP > Object-oriented programming
rahul
Witam.
Mam takie 2 tabele

Obrazek tabelek

trzecia (dolna tabelke) otrzymuje po wykonaniu zapytania : SELECT a.*, b.name as 'role_name', b.id as 'role_id' FROM gw_admins as a, gw_admin_roles as b WHERE a.id = '$id' AND key_id = '{$_SESSION['gw_admin']}' and a.role = b.id

i teraz moje pytanie. Jak mam sobie kontener na admina gdzie trzymam :

private $id;
private $gw_key_id;
private $username;
private $password;
private $email;
private $role;
private $first_name;
private $last_name;
private $phone;

czy powinienem tez trzymac private $role_id; nie chce robic osobnego obiektu dla samych roli bo mi bedzie nie potrzebny natomiast przy wywolaniu selectAdmin($id) chce znac jego role po nazwie i miec dostep do id tej roli.
Jak to z punktu OOP rozgryzc ? $admin= new Admin(); $admin->getRole()->getId() , jakos tak ?
LSM
Ja nie rozbijam w ogóle roli na osobna tabelę. Mam definicje stałych w pliku konfiguracynym config.php dla tych zmiennych np. define('SYSTEM_ROLE_USER', 'user'). Tych stałych używam w kodach, mam wtedy zachowaną czytelność, gdybym w kodzie uzywał numerków to musiałbym zaglądać do bazy aby przypomnieć sobie co, która cyferka oznacza - a głowa nie śmietnik. W tabeli SystemUser mam pole 'role' a w nim już konkretne nazwy 'admin', 'user'. Tabela SystemUser jest na tyle zgrabna, że nie widziałem potrzeby jej rozbijania ze wzgl. na pole 'role'. Obok pola 'role' ma również 'username', 'password', 'registerDate'.
Jeśli chcesz trzymać dane np. adresowe odn. użytkownika wtedy możesz obok tabeli SystemUser stworzyć tabelę PersonEntity, która będzie ogólną tabelą informującą o innych danych użytkownika. Można ją potem wykorzystywać w dowolnym projekcie, który nie wymaga akurat czegoś takiego jak konto użytkownika.
rahul
SOrry, ale nie do konca rozumiem takie podejscie. A co np. w momencie jakby mozna byloby dynamicznie dodawac nowe role. Tabela wydaje mi sie musi istniec, bardziej zastanawia mnie jak wtedy wygladac powinien obiekt. Narazie trzymam w nim i id roli i nazwe roli choc wydaje mi sie ze jest to troche zle, choc praktycznie.. sprawdza sie smile.gif.
Kedan
Cytat
$admin= new Admin(); $admin->getRole()->getId()

Bardzo dobry pomysł.

Jeśli potrzebujesz $role_id i $role_name w klasie usera to nie widzę przeszkód by takie pola utworzyć - choć osobiście zrobiłbym osobną klasę.

Na marginesie zastanawiam się czy nie lepiej byłoby utworzyć, prócz tabel 'users' i 'roles' trzecią tabelę relacji 'users_roles' [user)id, role_id], a generują zapytanie sql korzysstać z JOIN - w ten sposób możesz przypisać użytkownikowi wiele ról. No chyba że niepotrzebne Ci są relacje wiele-do-wielu smile.gif
rahul
Hej elo.
Drazac temat. Pytanie jak powyzej. Czy moge miec obiekt w obiekcie jezeli tak to czy jest ktos w stanie mi troszeczke to jakby lopatologicznie wyjasnic. Sytacja ma sie glownie w zapytaniach jak lacze rozne tabele i wyciagam info zwiazane nie tylko z jednym obiektem lecz z 2 a w przyszlosci pewnie i z wieksza iloscia.

Mam np. obiekt komentarz, yo.

[PHP] pobierz, plaintext

while($row = mysql_fetch_assoc($sql))
{
$comment = new comment();
$comment->setId($row['id']);
$comment->setGwKeyId($row['gw_key_id']);
$comment->setAuthorId($row['author_id']); // tutaj mam id autora, samo id mnie nie interesuje, chce znac imie i nazwisko. Aby nie zadawac 2 zapytan do bd, zadaje jedno duuuuze i wyciagam info, yo.
$comment->setTarget($row['target']);
$comment->setTargetId($row['target_id']);
$this->comment[] = $comment;
}


tak wiec robie LeftJoina. Np =

[PHP] pobierz, plaintext


$sql = mysql_query("select c.*, a.id as 'admin_id' , a.firstName as 'admin_firstName' , a.lastName as 'admin_lastName' , a.login as 'admin_login'
FROM gw_comments as c LEFT JOIN gw_admins as a ON c.author_id = a.id
WHERE target='$target'
AND gw_key_id = '{$_SESSION['gw_admin']}'
AND target_id = '$id'");




NO dobra i czy teraz obiekt admin sobie siedzi w obiekcie comentarz pod private $author_id czy mam stworzy 2 obiekt. Jak to ugryzc. Help
CuteOne
  1.  
  2. $commentObj = new Comments();
  3.  
  4. while($row = mysql_fetch_assoc($sql)) {
  5.  
  6. $commentObj -> addItem($row, new UserObject($row['author_id']));
  7.  
  8. echo $commentObj->user->getRole();
  9. echo $commentObj->getCommentName()->getCommentId();
  10. }


Comments to "kolekcja" do której pakujesz kolejne komentarze wraz z obiektem UserObject, który "zarządza" danymi autora komentarza. Nie opiszę ci tego dokładnie bo jest to kilka ładnych klas ale spokojnie nie zostawię cię z niczym wink.gif w książce bodajże PHP Zaawansowane programowanie(lub coś z Heliona nie pamiętam dokładnie) masz fajny przykład wykorzystania poprawnie skonstruowanej kolekcji do tego typu działań [to co tu napisałem to tylko taki hmmm skrót myślowy wink.gif]
rahul
czyli w obiekt komments pod zmienna np. private $author pakuje obiekt User, dobrze to rozumiem ?
mike
Tak. Dobrze to rozumiesz.
rahul
fuck yeah wink.gif
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.