2016-01-19 6 views
0

У меня есть этот запрос будетYii1 эквивалент запроса Sql

SELECT * FROM form_fields 
WHERE id NOT IN ("3", "1", "6") 
ORDER BY FIELD (id, "3" ,"1" ,"6") 

, который я хочу, чтобы преобразовать в запрос yii1. Так что я попытался как этот

$SQL="SELECT * FROM form_fields WHERE id NOT IN {$sorted_array} ORDER BY FIELD (id, $sorted_array)"; 
$connection=Yii::app()->db; 
$command=$connection->createCommand($SQL); 
$rowCount=$command->execute(); 
$dataReader=$command->query(); 

где $ sorted_array имеет значение Array ([0] => 3 [1] => 1 [2] => 6)

Он дал мне ошибку

PHP уведомление

Массив для преобразования строки

затем я преобразовал $ sorted_array в строку как это

$string = implode(' ', $sorted_array); 

и снова выполняется запрос

$SQL="SELECT * FROM form_fields WHERE id NOT IN {$string} ORDER BY FIELD (id, $string)"; 
$connection=Yii::app()->db; 
$command=$connection->createCommand($SQL); 
$rowCount=$command->execute(); 
$dataReader=$command->query(); 

Теперь я получаю другую ошибку

CDbException

CDbCommand не удалось выполнить SQL заявление: SQLSTATE [42000]: Ошибка синтаксиса или нарушение прав доступа: 1064 У вас есть ошибка в вашем SQL ; проверьте руководство, соответствующее версии вашего сервера MySQL , для правильного синтаксиса для использования рядом с «3 1 6 ORDER BY FIELD (id, 3 1 6)» на странице строка 1. Выполненный оператор SQL: SELECT * FROM form_fields WHERE идентификатор НЕ в 3 1 6 ORDER BY FIELD (ID, 3 1 6)

Вместо этого

SELECT * FROM form_fields 
    WHERE id NOT IN ("3", "1", "6") 
    ORDER BY FIELD (id, "3" ,"1" ,"6") 

мой запрос yii1 произвел этот ошибочный запрос SQL

SELECT * FROM form_fields 
WHERE id NOT IN 3 1 6 ORDER BY FIELD (id, 3 1 6) 

Любая помощь будет оценена

+0

См: HTTP://stackoverflow.com/questions/20875758/how-to-put-sql-query-in-an-array-in-yii –

ответ

1

Первый параметр implode должен быть запятая:

$string = implode(',', $sorted_array); 
+0

привет, это дало мне CDbException CDbCommand не смог выполнить statem SQL ent: SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «3,1,6 ORDER BY FIELD (id, 3,1,6)» в строке 1. Выполняемый SQL-оператор: SELECT * FROM form_fields WHERE id NOT IN 3,1,6 ORDER BY FIELD (id, 3,1,6) – Bloodhound

+0

Вы забыли скобки вокруг значений 'IN'. – topher

+0

спасибо. Как я пропустил эти :-) – Bloodhound

0

Лучший способ заключается в использовании QueryBuilder. Похоже

$result = Yii::app()->db->createCommand() 
       ->select('field1, field2') 
       ->from('table t') 
       ->join('table2 t2', 't2.t_id = t.id') 
       ->where('t.property = :property', [':property' => 1]) 
       ->queryRow(); 

Это более полезно, потому что QueryBuilder использовать PDO-заявления для параметров, и делает правильные запросы в SQL диалекте, который зависит от вашего типа СУБД.

Он также поддерживает операторы массива, например:

->where(['in', 'field', [1,2,3]]) 

Результат:

... WHERE field IN (1, 2, 3) ... 

И да, это все-таки DAO, без ActiveRecord :)