tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

Chyba: V DibiFluent sa FROM vždy prepisuje (je to chyba alebo vlastnosť)?

před 10 lety

gawan
Člen | 112

Zdravím,
Pri zložitejších SELECToch potrebujem SELECT skladať postupne a pripájam tam len tie tabuľky, ktoré naozaj potrebujem a presne v tú chvíľu, keď ich potrebujem. V DibiFluent som narazil na, podľa mňa, nie najlepšie správanie:

<?php
dibi::select('name')
    ->from('products')
    ->innerJoin('cagegory')->using('(category_id)')
        ->where('price > 100')
    ->innerJoin('supplier')->using('(supplier_id)')
    ->orderBy('name')
    ->test();

// a toto je vysledok:
// SELECT [name]
// FROM [products]
// INNER JOIN [cagegory] USING (category_id)
// WHERE price > 100
// INNER JOIN [supplier] USING (supplier_id)
// ORDER BY [name]
?>

Pozeral som do zdrojových kódov a zdá sa mi, že jednoduchou zmenou, by sa dalo dosiahnuť prirodzenejšie správanie. Stačí zmeniť:

+++ b/dibi/libs/DibiFluent.php
@@ -53,7 +53,7 @@ class DibiFluent extends DibiObject implements IDataSource
        /** @var array  clauses separators */
        public static $separators = array(
                'SELECT' => ',',
-               'FROM' => FALSE,
+               'FROM' => ' ',

síce ten pôvodný príklad nebude fungovať aj tak, ale ak by sa prepísal nasledovne, tak dostaneme očakávaný výsledok:

<?php
dibi::select('name')
    ->from('products')
        ->from('INNER JOIN cagegory')->using('(category_id)')
        ->where('price > 100')
    ->from('INNER JOIN supplier')->using('(supplier_id)')
    ->orderBy('name')
    ->test();

// SELECT [name]
// FROM [products]
// INNER JOIN cagegory USING (category_id)
// INNER JOIN supplier USING (supplier_id)
// WHERE price > 100
// ORDER BY [name]

?>

Nebolo by možné to v DibiFluent zmeniť? Chápem, že to môže byť zdroj nekompatibility, ak niekto využíva, že časť FROM sa vždy prepisuje, na druhej strane FROM by sa dalo po tejto zmene prepísať ľahko nasledovne:

<?php
dibi::select('*')->from('aaa')->from(FALSE)->from('bbb')->test();
?>

Lepším riešením by asi bolo, keby sa časť INNER/LEFT JOIN pripojila vždy na koniec FROM, ale nad tým sa mi nechcelo špekulovať ;)

před 10 lety

David Grudl
Nette Core | 6806

Mělo by to jít takto:

dibi::select('name')
        ->from('products')
        ->innerJoin('cagegory')->using('(category_id)')
        ->where('price > 100')
    ->clause('FROM')
        ->innerJoin('supplier')->using('(supplier_id)')
        ->orderBy('name')
        ->test();

před 10 lety

gawan
Člen | 112

ďakujem za odpoveď, aj keď trochu neskôr ;-)

před 10 lety

David Grudl
Nette Core | 6806

Chtěl jsem odpovědět s rozmyslem a ne ukvapeně :-))