3

ID、名前、ユーザーの 3 つの列を持つ MySQL テーブルがあります。Yii フレームワークで次の SQL を使用したいと考えています。

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

私は3つの異なる方法で試しましたが、成功しませんでした:

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 サーバーのバージョンに対応するマニュアルを参照して、3 行目の 'idName=7)' 付近で使用する正しい構文を確認してください。実行された SQL ステートメントは次のとおりです。 SELECT * FROM my_tableWHERE ( userIN ('1', '2', '3 ', '4')) AND (idName=7)

4

2 に答える 2

12

方法はたくさんありますが、私は Active Record を使用してこれを処理したいと考えています。ただし、あなたの質問はクエリビルダーに関するものでした。正しいものを提供します

編集: (コメントとして、idName は var char ではなく大きな INT です)

$arrayOfUsers1) 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

于 2013-08-09T17:25:23.727 に答える