この記事では、Yii フレームワークのパラメータ化クエリで IN クエリが 1 つしかクエリできない問題の解決策を主に紹介し、Yii フレームワークで IN クエリが 1 つだけクエリできる理由を例と関連関数の形式で分析します。 FIND_IN_SET 関数の使用スキルと必須の友人はそれを参照してください
この記事の例では、Yii フレームワークのパラメータ化されたクエリで 1 つの IN クエリしかクエリできない問題の解決策について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
yiiフレームワークでINクエリのパラメータ化を使用すると、結果が期待どおりになりません
1 2 3 4 5 6 | $sql =<<<SQL
SELECT id FROM tb WHERE id IN(:ids)
SQL;
$db = GeneralService::getSlaveDB();
$result = $db ->createCommand( $sql )->query([':ids' => '1013,1015,1017'])->readAll();
print_r( $result );
|
ログイン後にコピー
1 2 3 4 5 6 7 | Array
(
[0] => Array
(
[id] => 1013
)
)
|
ログイン後にコピー
そこで、関連するソースコードを確認しましたyii フレームワークでそれが PDO クエリであることがわかったので、PDO 関連情報をクエリしてその理由を見つけました: 一連の値をプレースホルダーに置き換えることはできません。
1 | SELECT id FROM tb WHERE userid IN ( ? );
|
ログイン後にコピー
理由が分かったので、次は、単純な一般科学に基づいてニーズを満たすことができる FIND_IN_SET 関数を見つけます
1 2 3 4 5 6 | $sql =<<<SQL
SELECT id FROM tb WHERE FIND_IN_SET(id, :ids)
SQL;
$db = GeneralService::getSlaveDB();
$result = $db ->createCommand( $sql )->query([':ids' => '1013,1015,1017'])->readAll();
print_r( $result );
|
ログイン後にコピー
。文字列str は N にあります。 サブチェーンで構成される文字列リスト strlist では、戻り値の範囲は 1 から N です。
文字列リストは、「,」記号で区切られたサブチェーンで構成される文字列です。最初の引数が定数文字列で、2 番目の引数が SET 型の列である場合、FIND_IN_SET() 関数はビット計算を使用するように最適化されます。
str が strlist にない場合、または strlist が空の文字列の場合、戻り値は 0 です。いずれかのパラメータが NULL の場合、戻り値は NULL になります。最初の引数にカンマ (',') が含まれている場合、この関数は正しく動作しません。
[追記] strlist内のカンマからなる文字列は通常通り使用できず、カンマの右側にスペースが入ると認識されません。
以上がYii クエリの IN クエリは 1 つのメソッドのみをクエリできますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。