Předání parametrů pro ORDER BY
- Sniclman
- Člen | 15
Ahoj,
řeším menší problém se správným zápisem ORDER BY přes metodu order
s parametry.
Potřebuji vygenerovat SQL dotaz s následujícím řazením
ORDER BY FIELD(id,5,8,4,6,9) DESC
ORDER BY FIELD(id,9,7,6,1,5) ASC
Mám k dispozici vždy pole ID
a směr řazení ASC
nebo DESC
.
$ids = [5,8,4,6,9]; // předáváno z metody, jen pro ukázku
$reverse = false; // předáváno z metody, jen pro ukázku
$selection->order('FIELD( id, ' . implode(',', $ids) . ' ) ' . ($reverse ? 'DESC' : 'ASC') );
// Prasácký zápis ale funguje
$selection->order('FIELD(id, ?) ?', $ids, $reverse ? 'DESC' : 'ASC');
// Vygneruje neplatný SQL dotaz, řazení ASC nebo DESC je ohraničeno apostrofy
// "ORDER BY FIELD(id,5,8,4,6,9) 'ASC'"
$selection->order('FIELD(id, ?) ?name', $ids, $reverse ? 'DESC' : 'ASC');
// Vygneruje neplatný SQL dotaz, řazení ASC nebo DESC je ohraničeno uvozovkami `
// "ORDER BY FIELD(id,5,8,4,6,9) `ASC`"
$selection->order('FIELD(id, ?) ?', $ids, new SqlLiteral($reverse ? 'DESC' : 'ASC'));
// Bezpečený zápis, nicméně ASC nebo DESC musí být v SqlLiteral
Nabízí se ještě zápis s ?order
ten ale vyžaduje pole
['id' => false]
⇒ ORDER BY id DESC
.
Zkoušel jsem toto:
$selection->order('?order', [new SqlLiteral('FIELD(id,?)', $ids) => $reverse]);
// Vyhodí chybu, klíč pole nemůže být SqlLiteral (illegal offset)
$selection->order('FIELD(id,?) ?order', $ids, $reverse);
// Vyhodí chybu,očekává že ?order bude pole
Budu rád za jakoukoliv radu jak správně použít metodu
order
. :-)
- Sniclman
- Člen | 15
Šaman napsal(a):
Double post odpovězený v anglickém vlákně.
https://forum.nette.org/…-for-oder-by
Příspěvek nebyl zodpovězený.
Zkuste se zdokonalit a napsat do anglického fóra. I když by to bylo s chybami – těmi se člověk učí. Příspěvek vám pomůže přeložit DeepL.
Chápu to tak, že má být příspěvěk v CZ a ideálně i v EN.
Editoval Sniclman (31. 1. 14:36)
- Kamil Valenta
- Člen | 820
Sniclman napsal(a):
Příspěvek nebyl zodpovězený.
Byl. To že z toho máš „bad feeling“ neznamená, že ta odpověď není validní.
Pokud pociťuješ hysterii ze spojování řetězců, můžeš ji pociťovat i z IFu nebo třeba breaku v cyklu. Všechno je potenciálním zdrojem chyb…
- Šaman
- Člen | 2662
Sniclman napsal(a):
Chápu to tak, že má být příspěvěk v CZ a ideálně i v EN.
Aha, tak já to chápu tak, že kdo se na to cítí, ať se ptá v anglické
části, ale dvojitý post dělá jen bordel. Kdybych hledal odpověď a najdu
nezodpovězené téma, počítám že odpověď je složitá, nebo je s ní
jiný problém. A ne, že je v jiném vláknu.
Možná se k tomu vyjádří @DavidGrudl?
Pro zajímavost – ten DeepL má rozhodně lepší výsledky, než Google translator, obzvlášť po AI úpravě přeloženého textu:
Oh, so my understanding is that anyone who feels like it can ask in the
English section, but a double post just makes a mess. If I'm looking for an
answer and find an unanswered topic, I assume the answer is complicated or
there's some other problem with it. And not that it's in another thread.
Perhaps @DavidGrudl can comment on this?
Editoval Šaman (31. 1. 18:07)
- Sniclman
- Člen | 15
Šaman napsal(a):
Sniclman napsal(a):
Chápu to tak, že má být příspěvěk v CZ a ideálně i v EN.Aha, tak já to chápu tak, že kdo se na to cítí, ať se ptá v anglické části, ale dvojitý post dělá jen bordel.
Možná bude stačit když @DavidGrudl upraví hlášku:
Zkuste se zdokonalit a napsat do anglického fóra. I když by to bylo s chybami – těmi se člověk učí. Příspěvek vám pomůže přeložit DeepL.
tak aby bylo jasné, že se nemají vytvářet duplicitní příspěvky CZ-EN.
Třeba něco jako:
Zkuste příspěvěk napsat v anglickém fóru {link na anglické fórum}. Příspěvek vám pomůže přeložit DeepL. Nevytvářejte příspěvky v CZ a současně v EN.