tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

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!