2017-06-22 1 views
0

J'ai cette requête SQL dans MySQLComment mettre une requête SQL dans QueryBuilder et éviter ``?

SELECT * FROM pt WHERE id=98 ORDER BY FIELD (position, 4, 3, 2, 1, 5) 

et je dois faire une requête dans Yii2. Quand j'écris

'query' => Pt::find()->where(['id' => $model->id]) 
     ->OrderBy('FIELD (`position`, 4, 3, 2, 1, 5)') 

Je reçois

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 20' at line 1 
The SQL being executed was: SELECT * FROM `pt` WHERE `id`=98 ORDER BY FIELD (`position`, `4`, `3`, `2`, `1`, `5)` LIMIT 20 

Comment éviter `` à la demande?

+0

Essayez '-> OrderBy ('FIELD (position, 4, 3, 2, 1, 5)')' – RiggsFolly

Répondre

2

Utilisez la classe yii\db\Expression car elle vous aidera à insérer le code RAW (sans le formater dans les requêtes générées), mais soyez prudent! N'insérez pas l'entrée utilisateur comme RAW dans les requêtes DB, car cela entraîne de graves vulnérabilités.

Le code de travail se présente comme suit:

'query' => Pt::find()->where(['id' => $model->id]) 
     ->orderBy(new \yii\db\Expression('FIELD (`position`, 4, 3, 2, 1, 5)')) 
+0

Merci! Ça marche. Je l'utilise uniquement pour la sortie dans GridView. – Vadim

+0

Je suis ravi! – Yerke