jak správně postupovat při použití Doctrine 2

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

V mé aplikaci mám Doctrine 2 integrováno podle Pandova řešení. Dříve jsem používal Dibi. Nyní se pokouším starý kód přepsat na Doctrinu, ale některé situace nevím jak ideálně vyřešit. Příklady:

  1. náhrada za dibi::fetch(), která vrací pole hodnot. Dříve jsem pro naplnění formuláře z db použil $form->setValues(dibi::fetch(...));, nyní mě Doctrine vrací entitu, která nic takového neumožňuje. Dopsal jsem si tedy do baseEntity svojí metodu pro návrat hodnot v poli.
public function getValues()
	{
		$data = array("id"=>$this->id);
		$vars = \get_class_vars(\get_class($this));
		foreach($vars as $key=>$var){
			try{
				$reflection = new \Nette\Reflection\PropertyReflection(\get_class($this), $key);
			}catch(\Exception $e){

			}
			if($reflection->hasAnnotation("column")) $data[$key] = $this->{$key};
		}
		return $data;
	}

Nyní mohu psát $form->setValues($entita->getValues());. Obdobně mám i $entita->setValues(). Nejsem si jistý, zda-li je toto řešení čísté.

  1. náhrada za dibi::query()->fetchAssoc();. Když použiju například $menu = $this->em->createQuery('SELECT u FROM Menu u WHERE u.parent IS NULL ORDER BY u.order')->getResult();, dostanu pole entit bez definovaných klíčů. To samé platí i u kolekcí v entitách (tedy vazby @oneToMany), chtěl bych docílit docílit, aby vrácené pole bylo asociováno podle klíče (popřípadě i jiného sloupce). Jak?
  2. Předpokládám, že Entity jsou součástí modelu. Chci si vytvořit model pro práci s menu. Mám tedy jednu třídu pro entitu Menu. Pak bych chtěl mít někde svojí vlastní metody, které pracují nad rámec jedné entity. Třeba addItem($name, $parent = Null) pro přidání nové položky. Kam tuto metodu umístit? Do entity jako static metodu, nebo mám vytvořit novou třídu se static metodama? Nejvíce by se mi líbilo řešení umístit tuto metodu do třídy EntityRepository, kterou používá entita Menu.
Nox
Člen | 378
+
0
-
  1. http://www.doctrine-project.org/…-language/en#…
  2. Možná to je jen nevhodný příklad, ale přidání položky do menu by mělo být v objektu Menu, ne?
arron
Člen | 464
+
0
-

ad 1:

	$query->getResult($dql, \Doctrine\ORM\Query::HYDRATE_ARRAY);

ad 3: O to by se mel starat nejaky MenuModel ne? Cili mas sice entitu Menu, ale ta sama o sobe by v zasade mela byt nezavisla na databazi (jasne je to Doctrine 2 entita, ale ciste filozoficky). Takze by nemela obsahovat zadne metody save atd. Na druhou stranu by mel existovat nejaky objekt, ktery vi, jak s entitami Menu ma zachazet, jak je ma ulozit atd. cili model. No a prave ten by mel mit metodu addItem.

Patrik Votoček
Člen | 2221
+
0
-
  1. $query->getScalarResult();
  2. už tady byl zmiňován INDEX BY
  3. to mluvíš o service vrsvě modelu. Je logické že tě napadlo použít vlasní repository. Je to ale špatně protože repository tak jak se používá v Doctrine 2 slouží pouze k načítání dat (tj všechno co vyvolává SELECT… by mělo být v repository. Všechno ostatní do ní nepatří.)