Správné načítání dat do entity

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tepster
Člen | 28
+
0
-

Zdravím,

mám entitu User, a v ní mimo jiné i položku roleName. V db mám v tabulce „user“ sloupec „role_id“, který odkazuje na tabulku „role“, kde jsou sloupce „id“ a „name“ (roleName je název role uživatele, např. admin, správce, guest…). Nad entitou je třída UserRepository, která v metodě „load“ vytvoří dotaz do db na tabulku „user“, předá ho statické metodě entity a ta vytvoří daty naplněnou třídu User. Problém ale je, jak do ní mám nahrát to roleName, když je v jiné tabulce? Jak to udělat správně? Asi není dobrý nápad si přímo té metodě entity User sahat do db. To by měla spíš dělat třída UserRepository. Mám pravdu? Jak se to řeší?

Díky

Azathoth
Člen | 495
+
0
-

Máš pravdu, komunikaci s databází by mělo řešit repository a ne entity samotné.
Co používáš za databázovou knihovnu? Pokud Nette Database, pak si doporučuji nastudovat activeRow a relace

Tepster
Člen | 28
+
0
-

Díky. Tím chceš jednoduše říct, že má vytvořit jeden SQL dotaz, ve kterém budou obsažena všechna data potřebná pro entitu (včetně roleName), že?

Ještě jsem se chtěl zeptat na jednu věc: Je správné, že používám repository jen jako statické metody? Jakože v presenteru dělám:

<?php
	$user = Model\UserRepository::load($this->getUser()->getId());
	// v $user je entita User naplněná daty o přihlášeném uživateli
?>
Jan Suchánek
Člen | 404
+
+1
-

@Tepster Repository si předávej z DI kontejneru, zaregistruj si je v třeba v config.neon

Tepster
Člen | 28
+
0
-

To mě také napadlo. Ale proč? Jaké to má výhody oproti tomu, co jsem psal já?

Azathoth
Člen | 495
+
0
-

@Tepster výhody to má takové, že když například budeš chtít měnit repository a budeš místo stávajícího použít jinou třídu, tak teď bys musel přepisovat název třídy všude, zatímco pokud budeš používat DI, stačí vyměnit třídy v configu.
A až budeš chtít někdy testovat a místo repository s přístupem do databáze budeš chtít použít nějakou jinou repository, tak při použití DI předáš své jiné repository, zatímco teď…

Tepster
Člen | 28
+
0
-

Děkuji…

Na jednu otázku mi ještě nebylo odpovězeno:

Díky. Tím chceš jednoduše říct, že má vytvořit jeden SQL dotaz, ve kterém budou obsažena všechna data potřebná pro entitu (včetně roleName), že?