【问题标题】:How to use IN/AND clause in Yii framework?Yii框架中如何使用IN/AND子句?
【发布时间】:2013-08-09 16:39:59
【问题描述】:

我有一个包含 3 列的 MySQL 表:ID、名称、用户。 我希望在 Yii 框架中使用以下 SQL:

$sql = "SELECT * FROM my_table WHERE idName=".$name." AND user IN .$arrayOfUsers;
// $arrayOfUsers is an array of int [0]->1, etc.

我尝试了三种不同的方法,但都没有成功:

1)

$sql = "SELECT * FROM my_table WHERE idName=".$name." AND user IN .$arrayOfUsers;
$command = $connection->createCommand($sql);            
$dataReader = $command->query();          
$query = $dataReader->readAll();

错误是:

PHP 错误 [8]

数组到字符串的转换

2)

$query = Yii::app()->db->createCommand()
    ->select('*')
    ->from('my_table')
    ->where(array('and', array('in', 'user', $arrayOfUsers), array('idName' => $name)))
    ->queryAll();

错误是:

PHP 错误 [8]

未定义的偏移量:0

3)

 $query = Yii::app()->db->createCommand()
        ->select('*')
        ->from('my_table')
        ->where(array('and', array('in', 'user', $arrayOfUsers), 'idName='.$name)))
        ->queryAll();

错误是:

CDbException

CDbCommand 执行 SQL 失败 语句:SQLSTATE [42000]:语法错误或访问冲突:1064 你 您的 SQL 语法有错误;检查对应的手册 您的 MySQL 服务器版本,以便在 'idName=7)' 附近使用正确的语法 在第 3 行。执行的 SQL 语句是:SELECT * FROM my_table WHERE (user IN ('1', '2', '3', '4')) 和 (idName=7)

【问题讨论】:

  • 对不起,我认为这不是 Yii 问题,但可能是 MySQL 问题

标签: mysql-error-1064 yii


【解决方案1】:

有很多方法可以做,但我想使用 Active Record 来处理这件事。 但是,你的问题是关于查询生成器的,我给你一个正确的

已编辑:(正如您的评论,idName 是大 INT 而不是 var char)

1) 你得到了错误,因为你传递了 $arrayOfUsers 这是数组,而不是你的 sql 上的预期字符串。应该是

 $connection=Yii::app()->db;
        $sql = "SELECT * FROM my_table WHERE idName=".$name." AND (user IN(".implode(',',$arrayOfUsers)."))";
        $command = $connection->createCommand($sql);
        $query = $command->queryAll();

2) 使用Query builderwhere operator

$query = Yii::app()->db->createCommand()
            ->select('*')
            ->from('my_table')
            ->where(array('in', 'user', $arrayOfUsers))
            ->andwhere('name = :name', array('idName'=>$name))
            ->queryAll();

3)如果你想把它们包起来也可以,但是它们看起来像这样不雅观

$query = Yii::app()->db->createCommand()
            ->select('*')
            ->from('my_table')
            ->where(array('and', 'idName= ' . $name, array('in', 'user', $arrayOfUsers)))
            ->queryAll();

更多关于如何使用where operator的参考来自官方文档

// WHERE id=1 or id=2
where('id=1 or id=2')
// WHERE id=:id1 or id=:id2
where('id=:id1 or id=:id2', array(':id1'=>1, ':id2'=>2))
// WHERE id=1 OR id=2
where(array('or', 'id=1', 'id=2'))
// WHERE id=1 AND (type=2 OR type=3)
where(array('and', 'id=1', array('or', 'type=2', 'type=3')))
// WHERE `id` IN (1, 2)
where(array('in', 'id', array(1, 2))
// WHERE `id` NOT IN (1, 2)
where(array('not in', 'id', array(1,2)))
// WHERE `name` LIKE '%Qiang%'
where(array('like', 'name', '%Qiang%'))
// WHERE `name` LIKE '%Qiang' AND `name` LIKE '%Xue'
where(array('like', 'name', array('%Qiang', '%Xue')))
// WHERE `name` LIKE '%Qiang' OR `name` LIKE '%Xue'
where(array('or like', 'name', array('%Qiang', '%Xue')))
// WHERE `name` NOT LIKE '%Qiang%'
where(array('not like', 'name', '%Qiang%'))
// WHERE `name` NOT LIKE '%Qiang%' OR `name` NOT LIKE '%Xue%'
where(array('or not like', 'name', array('%Qiang%', '%Xue%')))

http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder

【讨论】:

  • 1)

    CException

    CDbCommand 及其行为没有名为“andwhere”的方法或闭包。
    2)

    CDbException

    CDbCommand未能执行SQL语句:SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'idName="7") AND (user IN ('1', '2', '3', '4'))' 附近使用的正确语法第 3 行。执行的 SQL 语句是:SELECT * FROM my_table WHERE (idName="7") AND (user IN ('1', '2', '3', '4'))

  • yii 1.1.13 增加了andWhere()函数。看来您使用的是旧版本的 yii。更新框架或者你可以试试我的解决方案 1 stackoverflow.com/questions/15004419/…
【解决方案2】:

试试这个

$criteria = new CDbCriteria();
$criteria->select = "*";
$criteria->condition = "idname = :name ";
$criteria->params = array ( 
':name' => $name,
);
$criteria->addInCondition('user', $arrayOfUsers);
my_table::model()->findAll($criteria);

【讨论】:

  • CDbException

    CDbCommand 未能执行 SQL 语句:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'idName= '7' ) AND (user IN ('1', '2', '3', '4'))' 附近使用正确的语法. 执行的S​​QL语句为:SELECT * FROM my_table t WHERE (idName= :idName ) AND (user IN (:ycp0, :ycp1, :ycp2, :ycp3))

  • idname 字段是整数还是 varchar ?
  • 您在上面发布的不使用 yii 的简单 sql 查询是否正确执行?
  • 我尝试在 phpmyadmin 中输入以下查询:SELECT * FROM my_table WHERE idName=7 AND user IN (1,2,3,4),我遇到了同样的错误!为什么?此外,phpmyadmin 说:列名 'idName' 是 MySQL 保留关键字。 可能是这个问题吗?
  • 是的,这是主要问题,首先修复它,然后在 yii 中尝试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2012-07-06
相关资源
最近更新 更多