Odkazy: dibi | API reference

Forum: [česky] [english]

dibi fórum

tiny ‘n’ smart
database layer

Nejste přihlášen(a)

#1 před 2 lety

gawan
Člen
Registrovaný: 5. 5. 2006
Příspěvky: 107

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

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ť ;)

 

#2 před 2 lety

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

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

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();

 

#3 před 2 lety

gawan
Člen
Registrovaný: 5. 5. 2006
Příspěvky: 107

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

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

 

#4 před 2 lety

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

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

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

 

Zápatí