Reprezentace databazové struktůry objektem

Fires
Člen | 89
+
0
-

Zdravím jakým způsobem reprezentujete řádky tabulky jako objekty? Je to banalní dotaz ale mám v tom bordel. Přečetl jsem dokumentaci a prošel examples a forum ale furt nevím. V examples CD collection se předává do app z modelu přímo výsledek dotazu takže row. Což je hezké a elegantní ale co když potřebuju v objektu mít více informací které nejsou v db a plní se až za běhu etc. Teď to řeším např. UserObject + UserObjectFactory. UserObject používá SmartObject ale pro každý sloupec databáze poté musím vytvářet proměnou + setter a getter. Při ukládání do databáze pak mam metodu UserObject->getDatabaseArray(). Která vráti obsah objektu jako pole a to pak dávám jako argument update. Toto řešení mi přijde ale hodně nepěkné a komplikované. UserObject který má 13 „sloupců“ má hned 130 řádků kódu. Plus pokud upravím databázi musím myslet na úpravu objektu. Dale mám pak škaredé metody které plní data z db row do objektu např.

 		public function __construct($data = []) {
                if (!empty($data)) {
                        $this->fillData($data);
                }
        }

        public function fillData($data) {
                foreach ($data as $key => $value) {
                        $this->$key = $value;
                }
        }

Asi k tomuto problému přistupuju úplně špatně.

Předem díky za názor a radu.

Marek Bartoš
Nette Blogger | 1146
+
+1
-

Objekt představující tabulku v databázi s jinými daty spíš nemíchej. Místo dvou jednoduchých objektů budeš mít jeden komplikovaný.

Pokud chceš k databázi přistupovat kompletně objektově, tak můžeš použít místo nette/database orm. nextras/orm nebo doctrine/orm. Namapují ti data mezi databází a objektem (skoro) automaticky, včetně vazeb.
Nextras je jednodušší na použití a rychlejší. Doctrine zas má extensions pro kontrolu, zda objekt odpovídá schematu v databázi, což Nextras nejspíš ještě chvíli mít nebude.

Pro nette/database existuje generátor pro phpstorm metadata, aby ti i ActiveRow napovídal sloupce a tuším, že autor připravuje i phpstan extension, ale netuším jak moc dobré to je https://github.com/…ta-generator

Fires
Člen | 89
+
0
-

Marek Bartoš napsal(a):

Objekt představující tabulku v databázi s jinými daty spíš nemíchej. Místo dvou jednoduchých objektů budeš mít jeden komplikovaný.

Pokud chceš k databázi přistupovat kompletně objektově, tak můžeš použít místo nette/database orm. nextras/orm nebo doctrine/orm. Namapují ti data mezi databází a objektem (skoro) automaticky, včetně vazeb.
Nextras je jednodušší na použití a rychlejší. Doctrine zas má extensions pro kontrolu, zda objekt odpovídá schematu v databázi, což Nextras nejspíš ještě chvíli mít nebude.

Pro nette/database existuje generátor pro phpstorm metadata, aby ti i ActiveRow napovídal sloupce a tuším, že autor připravuje i phpstan extension, ale netuším jak moc dobré to je https://github.com/…ta-generator

Super diky, pokud bych chtěl zachovat stavajici „přístup vannila nette“ bylo by tedy vhodné mít dva typy objektů např. UserDatabaseObject a UserObject? S tím že by UserObject ze sebe uměl exportovat/importovat UserDatabaseObject pro import/export db? Tak aby objekt se kterým se bude pracovat a objekt reprezentující 1:1 db row byly oddělené? Nextras vypada super asi pujdu touto cestou v budoucnu.

Marek Bartoš
Nette Blogger | 1146
+
+1
-

Ano, šel bych touhle cestou. Volím raději kompozici a jednoduché, na sobě ideálně nezávisející objekty, ale oddělit databázi od další logiky je dobrý první krok. Něco jako:

final class User
{
	// ...
	public function getDbUser(): DbUser
	{
		// ...
	}
}