状況
LaravelでselectRawを使いselect文を書き、バインド変数を設定しクエリを発行したところInvalid parameter number
のエラーが発生した。
$data = 100;
$query = self::selectRaw(
"'?' as test_column",
[$data]
);
return $query->get()->toArray();
message: "SQLSTATE[HY093]: Invalid parameter number (SQL: select '100' as test_column from `test_table`)"
Invalid parameter number
(パラメータの数合ってないよ!)ってなってるけど、バインド変数の数(selectRaw
の第2引数)もあってるし、エラーで出力されてるSQL見るとちゃんとバインドされてるし何でだ。。。と途方に暮れました。。。
https://readouble.com/laravel/8.x/ja/queries.html
結論
バインド変数の前後の'
(シングルコーテーション)を削除したら問題なく動いた
$data = 100;
$query = self::selectRaw(
"? as test_column",
[$data]
);
return $query->get()->toArray();
本来もっと複雑なSQLでの出来事だったので、数値型の値を文字列として連結して扱いたかったので、シングルコーテーション無しで?
を書き、CONCATを使って連結して文字列にすることで解決
CONCAT('Point(', ?, ' ', ?, ')')) AS `test_column`"
補足
'
で値をくくっても問題なく値は取得できる(取得した値がstring型かint型かの違い)
$query = self::selectRaw(
"'100' as test_column",
);
return $query->get()->toArray();
// 問題なく動作する
$query = self::selectRaw(
"100 as test_column",
);
return $query->get()->toArray();
// 問題なく動作する
考察
エラーメッセージからすると、バインド変数の数(?
の数)とバインドする値の数(selectRaw
の第2引数の配列の長さ)が一致していないエラーなので、Laravelの中でSQLの中のシングルコーテーションの中にある?
の数の算出がうまくいっていないものと考えられる。
ちょっとソースコード読んでみるかな。。。