Autor Zpráva
pavelkos
Profil *
Ahoj,

mam problem s navrhem trid, ktere obaluji DB tabulky - vysvetlim na prikladu:

v DB mame tabulku "users" s typickymi atributy - jmeno, prijmeni, mesto, pcs, cislo domu atd...

udelam tedy tridu User a v konstruktoru ji predam ID a nactu data z DB
trida user bude mit dalsi metody pro zpracovani atributu - napr sestaveni stringu pro vyslednou adresu apod.

pak bych napr. pri zobrazovani profilu udelal neco takoveho:
$user = new User($id);
echo "Bydliste: ".$user->getAddress();

pokud ale budu chtit vypsat napr. poslednich 10 prihlasenych uzivatelu, tak jsem v haji.
Co me napada je vytvorit tridu User (v konstruktoru ji predam vsechny atributy) a pak mit tridu Users, ktera se bude
starat o nacitani dat z DB a bude mit pole objektu User
ale toto se mi zda slozite... :(

Jak to resite vy? ;-)

Diky
blaaablaaa
Profil *
uzivatele si ukladej do pole ... pokud zadas id, bude to pole o jednom prvku, pokud zavolas metodu treba lastLogged, bude mit 10 polozek, ...
BetaCam
Profil
pavelkos
Třída User už podle svého jména by měla reprezentovat pouze jednoho uživatele.
joe
Profil
pavelkos
Můžeš si vytvořit další třídu - Users, která třeba zdědí třídu User, ale nemusí, to záleží co všechno v ní máš.

Možná lepší by bylo mít jen jednu třídu pro práci s uživateli, takže třeba pro získání adresy by jsi napsal

$users->getAddress(idUzivatele);

Záleží na tom jaké operace budeš potřebovat, možná bych to ani nerozlišoval jestli se jedná jen o jednoho uživatele nebo o práci s více uživatelama. Ale to záleží co chceš aby to všechno umělo. A správně by třídu měl reprezentovat její název (BetaCam)...
Mastodont
Profil
pak mit tridu Users, ktera se bude starat o nacitani dat z DB a bude mit pole objektu User

Jistě to jde tak udělat. A co se bude dít s těmi jednotlivými júsry?
pavelkos
Profil *
Jistě to jde tak udělat. A co se bude dít s těmi jednotlivými júsry?

no prave ty jedntlivy User budou uchovavat ty data nacteny s DB + budou mit metody getAddress atd...
ale zda se mi to prilis slozite
Aesir
Profil
pavelkos:

Osobně mám napsané abstraktní třídy implementující návrhový vzor Active Record, následně pro každou tabulku vytvořím třídu, která dědí onu abstraktní a používá již definované metody (např. pro přístup ke sloupcům tabulky) + své rozšířené (např. vaše getAddress apod.).
pavelkos
Profil *
Osobně mám napsané abstraktní třídy implementující návrhový vzor Active Record, následně pro každou tabulku vytvořím třídu, která dědí onu abstraktní a používá již definované metody (např. pro přístup ke sloupcům tabulky) + své rozšířené (např. vaše getAddress apod.).
Jasne, ale u active Record predstavuje jedna instance jeden radek tabulky ne?
Takze pro vypsani poslednich 10-ti prihlasenych uzivatelu se 10x pristupuje k databazi?

Diky za odpoved.
BetaCam
Profil
pavelkos
ale zda se mi to prilis slozite

No jestli ti přijde nadefinování dvou tříd složité tak nechci vidět co budeš dělat až budeš mít udělat něco opravdu složitého.
Aesir
Profil
pavelkos:
Jasne, ale u active Record predstavuje jedna instance jeden radek tabulky ne?
Takze pro vypsani poslednich 10-ti prihlasenych uzivatelu se 10x pristupuje k databazi?


Nemusí, mám dvě třídy, jeda je abstract Table, druhá abstract TableRow, přes třídu Table se dotážete na posledních 10 přihlášených a ta Vám vrátí kolekci 10ti objektů TableRow. Například :)

Edit, snad srozumitelněji: Takže se do databáze dotážete jen jednou přes objekt Table, která vygeneruje pro každý výsledek objekt nad kterým můžete dělat další operace.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0