Doctrine 2 – entita vyžadující hodnotu z jiné tabulky

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

Zdravím,

pro příklad budu mít v databázi uložen nějaký předmět, u kterého si uložím čas vytvoření a který budu chtít po určité době smazat.
Entita pak zjednodušeně může vypadat třeba takto:

<?php

/**
 * @ORM\Entity
 */
class Item
{

	/**
	 * @ORM\Column(type="datetime")
	 */
	private $dateCreated;


	public function expired()
	{
		$now = new DateTime();
		$expirationDate = $this->dateCreated->modify("+7 day");

		if ($now > $expirationDate) {
			return TRUE;
		}

		return FALSE;
	}

}

?>

Takto zjistím, jestli předmět expiroval po sedmi dnech jeho vytvoření. Jelikož ale nechci mít tuto hodnotu natvrdo v programu, mám tabulku v databázi (dejme tomu pojmenovanou jako ‚variables‘).
Mohl bych tu hodnotu nějak předat přes konstruktor, ale čím víc entita poroste, tím více bude potřebovat takových hodnot z databáze – a většinu z nich ani nebude pro jeden určitý účel potřebovat.
Řešit by to šlo i externí třídou, která má přístup k EntityManageru, ale pak bude za entitu hodně věcí řešit právě tato třída a ne entita samotná. I když něco takového funguje, asi to není úplně správné řešení:

<?php

class ItemFacade
{

	/** @var EntityManager */
	private $em;

	/** @var VariableFacade */
	private $variableFacade;

	public function __construct(EntityManager $em, VariableFacade $variableFacade)
	{
		$this->em = $em;
		$this->variableFacade = $variableFacade;
	}


	public function itemExpired(Item $item)
	{
		// v tabulce jsou sloupce 'name' a 'value'
		// v tomto příkladu pak  item_expiration_days = 7
		$days = $this->variableFacade->getVariable("item_expiration_days");
		$now = new DateTime();
		$expirationDate = $item->dateCreated->modify("+$days day");

		if ($now > $expirationDate) {
			return TRUE;
		}

		return FALSE;
	}


	// fasáda pak obsahuje i další metody, jako je smazání předmětů atd., neslouží proto jen pro tento jeden účel

}

?>

Máte nějaké nápady, jak tento problém řešit?
Moc děkuji.

Jiří Nápravník
Člen | 710
+
+1
-

Přes konstruktor bych to určitě nedával, tam by dle mě měli být věci týkající se entity, tohle je spíše systémový údaj, než specificky pro danou entitu.

Možnostíje ta fasáda, ale já bych to řesil, tak, že bych to nechal v entitě a jako parametr by bylo days, který si pak předám z toho místa, co potřebuji či-li něco takového:

	public function expired($days)
    {
        $now = new DateTime();
        $expirationDate = $this->dateCreated->modify("+" . $days . " day");

        if ($now > $expirationDate) {
            return TRUE;
        }

        return FALSE;
    }

----dalsi trida
	if($entity->expired(/zde predam tu hodnotu z variables/)){
		echo 'Expirováno';
	}