Oznámení
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ě :-))