Správné načítání dat do entity
- Tepster
- Člen | 28
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
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
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
@Tepster Repository si předávej z DI kontejneru, zaregistruj si je v třeba v config.neon
- Azathoth
- Člen | 495
@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ď…