Reprezentace databazové struktůry objektem
- Fires
- Člen | 97
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 | 1280
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 | 97
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 | 1280
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
{
// ...
}
}