Oznámení
Jak volat dříve join() před from() na DibiFluent
před 8 lety
- knyttl
- Člen | 197
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
před 8 lety
- HosipLan
- Moderator | 4693
Nijak, přepiš svoje modely tak, aby nezávisely na pořadí zavolání nějakých metod.
před 8 lety
- knyttl
- Člen | 197
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.
před 8 lety
- HosipLan
- Moderator | 4693
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.
před 8 lety
- knyttl
- Člen | 197
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)
před 8 lety
- HosipLan
- Moderator | 4693
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'));
}
před 8 lety
- knyttl
- Člen | 197
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é.
před 8 lety
- HosipLan
- Moderator | 4693
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;
}
}
před 8 lety
- knyttl
- Člen | 197
Zajímavé, díky!