Odkazy: dibi | API reference

Forum: [česky] [english]

dibi fórum

tiny ‘n’ smart
database layer

Nejste přihlášen(a)

#1 před rokem

mcmatak
dibi guru
Registrovaný: 17. 7. 2009
Příspěvky: 364

Je nutné aby v dibi záleželo na pořadí dotazů? tzn. jestli se provede from() a pak select() ?

Vysvětlím:

příklad:

<?php

                echo dibi::select("*")
                                ->select("*")
                                ->select(
                                        dibi::select("*")
                                                ->select("*")
                                )
                                ->select("*")
                                ->from("table")
                                ->select('table.id')
                                ->leftJoin('table2')->on('foo=doo')
                                ->select('table.name');
?>
  1. dibi funguje tak, že si porovnává u každé fce select(), from() atd. jestli jsou to povolené příkazy pro daný command, a vzdy si uloží poslední použitý, takže když zavolám from on ví že naposledy jsme použili from, když pak zavolám nějaký příkaz který nezná, tedy např. LEFT JOIN, JOIN atd. tak on neví co s ním a zařadí ho do poslední použité clausule, pokud použiji souslednost from() a potom select() mylně mi to left join vloží do select clausule
  2. fixli jsme to takto
<?php
        /** @var array  co k cemu patri */
        public static $owners = array(
                'JOIN' => 'FROM',
                'LEFT JOIN' => 'FROM',
        );
?>

vytvorili jsme ownera, a ve funkci __call

<?php
radek: 173

                        if (isset(self::$owners[$clause])) {
                                $this->cursor = & $this->clauses[self::$owners[$clause]];
                        }
?>

kontrolujeme jestli neznámá klauzule náhodou nepatří nějakému vlastníkovi, pak víme že se zařadí vždy do from

asi to není úplně ideální ale jinak to nejde

jde o to že třeba v šabloně použijete něco jako select(name, description) a obvykle šablona už ten fluent má, včetně from atd. tedy souslednost těch funkcí nelze dodržet

 

#2 před rokem

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5563

Re: Je nutné aby v dibi záleželo na pořadí dotazů? tzn. jestli se provede from() a pak select() ?

Přidal jsem to tam.

 

#3 před rokem

PunchyRascal
Nový člen
Registrovaný: 10. 7. 2010
Příspěvky: 3

Re: Je nutné aby v dibi záleželo na pořadí dotazů? tzn. jestli se provede from() a pak select() ?

pro ty, kteří by si rádi tuto funcionalitu rádi přidali do svého aktuálního dibi, jde o soubor dibi/libs/DibiFluent.php

Ve fci __call po lazy inicializaci, tj. „if ($this->command === NULL) {…“ přidat:

<?php
                // auto-switch to a clause
                if (isset(self::$clauseSwitches[$clause])) {
                        $this->cursor = & $this->clauses[self::$clauseSwitches[$clause]];
                }
?>

a v témž souboru přidat na začátku pod definicí „public static $separators = array(…“ následující:

<?php
        /** @var array  clauses */
        public static $clauseSwitches = array(
                'JOIN' => 'FROM',
                'INNER JOIN' => 'FROM',
                'LEFT JOIN' => 'FROM',
                'RIGHT JOIN' => 'FROM',
        );
?>

 

Zápatí