tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

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

před 9 lety

mcmatak
Člen | 492

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

před 9 lety

David Grudl
Nette Core | 6806

Přidal jsem to tam.

před 9 lety

PunchyRascal
Člen | 3

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',
    );
?>