Nejste přihlášen(a)
Ahoj,
mám jeden obecný model a k němu několik specifických, které od něj dědí.
Metoda fetch() v obecném modelu provede několik operací, které se mají aplikovat pro všechny. Tedy konkrétně provede jeden JOIN, WHERE a ORDER.
Ve specifickém modelu potom volám FROM a další WHERE.
Problém je ten, že JOIN se zařadí před FROM a dotaz je neplatný. Přesouvat ten JOIN z obecného do specifického po klauzulu FORM by znamenalo duplicitu mezi všemi specifickými modely, což určitě nechci. Jak na to?
Děkuju
Nijak, přepiš svoje modely tak, aby nezávisely na pořadí zavolání nějakých metod.
Neptej se, jestli se můžeš ptát | Blog | Twitter | GitHub | CMS Kdyby
Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni
Ony na tom nezávisí. Já jen prostě chci mít obecné věci v obecném modelu a specifické ve specifickém. To DibiFluent má problém s pořadím.
Ne, ty máš problém :) Je sice pravda, že to from by to mohlo
řadit před ostatní, ale pochybuju, že se to bude chtít Davidovi
předělávat.
Neptej se, jestli se můžeš ptát | Blog | Twitter | GitHub | CMS Kdyby
Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni
No to bez diskuse je můj problém!
Ale tak opravdu, jak bys to udělal jinak? Př.
CommonModel::fetch() {
return dibi::select('t.*')->join('tags', 'tt')->using('fruit_id')->where('state = "ok"');
}
AppleModel::fetch() {
return parent::fetch()->from('apples');
}
PearModel::fetch() {
return parent::fetch()->from('pears');
}
Editoval knyttl (21. 8. 2011 21:56)
Já bych v první řadě statický model už nikdy nepsal :)
CommonModel::whereTags(DibiFluent $q) {
return $q->join('tags', 'tt')->using('fruit_id')->where('state = "ok"');
}
AppleModel::fetch()
{
return self::whereTags(dibi::select('t.*')->from('apples'));
}
PearModel::fetch()
{
return self::whereTags(dibi::select('t.*')->from('pears'));
}
Neptej se, jestli se můžeš ptát | Blog | Twitter | GitHub | CMS Kdyby
Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni
To byl jen příklad, chtěl jsem aby bylo zřejmý, co k čemu náleží. Statický to nemám.
To whereTags se mi ale vůbec nelíbí – předávám něco rodiči, pak to vracím dítěti… Prostě to není hezké.
To se pleteš http://sourcemaking.com/…plate_method
Každopádně, zapsal jsem to tak, jakou jsi zvolil formu. Kdybych to měl rozvést:
class CommonModel extends Nette\Object
{
protected function whereTags(DibiFluent $q)
{
$q->join('tags', 'tt')->using('fruit_id');
}
protected function whereIsStateOK(DibiFluent $q)
{
$q->where('state = "ok"');
}
}
class AppleModel extends CommonModel
{
public function fetch()
{
$q = $this->db->select('t.*')->from('apples');
$this->whereTags($q);
$this->whereIsStateOK($q);
return $q;
}
}
Neptej se, jestli se můžeš ptát | Blog | Twitter | GitHub | CMS Kdyby
Nette Jabber Room – nette@conf.netlab.cz , všichni jste vítáni
Zajímavé, díky!