Oznámení
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');
?>
- 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
- 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',
);
?>