Předání parametrů pro ORDER BY

Sniclman
Člen | 10
+
0
-

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. :-)

Šaman
Člen | 2635
+
+1
-

Double post odpovězený v anglickém vlákně.
https://forum.nette.org/…-for-oder-by

Sniclman
Člen | 10
+
-1
-

Š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 | 762
+
+1
-

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 | 2635
+
+2
-

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 | 10
+
0
-

Š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.