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
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:
- 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é.
- 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? - 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
- http://www.doctrine-project.org/…-language/en#…
- 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
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
- $query->getScalarResult();
- už tady byl zmiňován INDEX BY
- 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ří.)