我有这个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 在哪里不是3 1 6按字段顺序(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 :(得分:1)
implode的第一个参数应该是逗号:
$string = implode(',', $sorted_array);
答案 1 :(得分: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方言中进行正确的查询,这取决于您的DBMS类型。
它还支持数组语句,如下所示:
->where(['in', 'field', [1,2,3]])
结果是:
... WHERE field IN (1, 2, 3) ...
是的,它仍然是DAO,没有ActiveRecord :)