Jak v NDB zapsat ORDER BY FIELD pomocí SqlLiteral?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
enumag
Člen | 2118
+
0
-

Potřeboval bych pomocí v NDB Selection (Nette 2.1) zapsat takovouto ORDER klauzuli. Zřejmě by to mělo jít pomocí SqlLiteral, ale nedaří se mi to. Jak na to?

Zkouším to přes SqlLiteral s parametry, ale Nette mi pokaždé vyhodí výjimku „There are more placeholders than passed parameters.“ (což je imho bug protože ve stringu je 1 otazník a jako parametry předávám jednoprvkové pole).

->order(new \Nette\Database\SqlLiteral('FIELD(id, ?)', array($ids)))

Editoval enumag (3. 3. 2014 22:41)

David Matějka
Moderator | 6445
+
0
-

order podporuje parametry primo, takze staci

->order('FIELD(id, ?)', $ids)

Editoval matej21 (3. 3. 2014 22:46)

enumag
Člen | 2118
+
0
-

@matej21: Aha, funguje skvěle, díky! I tak ale ty parametry pro SqlLiteral jsou nějak zabugované…

David Matějka
Moderator | 6445
+
0
-

@enumag: ty parametry pro sql literal fungujou dobre, jen nejsou podporovany vsude :)

imho by to spis melo vyhodit InvalidArgumentException na mistech, kde to neni podporovany. coz jsou prave v selection where, select, order… jelikoz z nich se vytvori vysledny SQL a sql literal se prevede na string a ztrateji se tak parametry.

ale sql literal by melo byt funkcni jako parametry do techto fci, jako

->where('id = ?', new SqlLiteral('XXX(?)',1));
enumag
Člen | 2118
+
0
-

kde to neni podporovany. coz jsou prave v selection where, select, order

A kde to tedy podporovaný je? :-D

Jinak díky zavysvětlení, chyba je tedy akorát v tom že to hází špatnou výjimku.

David Matějka
Moderator | 6445
+
0
-

sam nevim :) asi v parametrech where, order apod. (ale v tom nevidim moc vyznam), ale hlavne je to uzitecny treba pro ->update()

->update(array(
	'hits' => new SqlLiteral('hits + ?', array(1)),
));
David Grudl
Nette Core | 8282
+
0
-

Mělo by fungovat i

->update(array(
    'hits+=' => 1,
));