1

こんにちは私はアジャイルツールキットでいくつかのDSQLクエリを書いていますが、少し混乱しています。次のDSQLコードがあるとします。

$select = $select->add('Model_Rental')->dsql()
                         ->field('id')
                         ->where('dvd_id', $select->getField('id'))
                         ->where('is_returned!=', 'Y');
return "if(($select) is null,'N','Y')";

次のSQLエラーが発生します。

pdo_error: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound
mode: select
params: Array ( )
query: select (select `name` from `movie` where `dvd`.`movie_id` = `movie`.`id` ) `movie`,`code`,if((select `id` from `rental` where `dvd_id` = `dvd`.`id` and `is_returned` != :a ) is null,'N','Y') `is_rented`,`id` from `dvd`
template: select [options] [field] [from] [table] [join] [where] [group] [having] [order] [limit]

しかし、同じ引用符の中で条件を定義すると、エラーは発生しません。

$select = $select->add('Model_Rental')->dsql()
                         ->field('id')
                         ->where('dvd_id', $select->getField('id'))
                         ->where('is_returned!="Y"');
return "if(($select) is null,'N','Y')";

それは私に期待を与えます:

select (select `name` from `movie` where `dvd`.`movie_id` = `movie`.`id` ) `movie`,`code`,if((select `id` from `rental` where `dvd_id` = `dvd`.`id` and is_returned!="Y" ) is null,'N','Y') `is_rented`,`id` from `dvd`

状態を次のように記述しなければならないのはなぜですか。

->where('is_returned!="Y"');

なぜ私は書くことができないのですか?

->where('is_returned!=', 'Y');

ありがとう!

4

1 に答える 1

0

更新: DSQLはスタンドアロンライブラリにリファクタリングされました:git.io/dsql

$dsqlオブジェクトを表す$selectには、クエリと引数の両方が含まれます。それを文字列に変換するとき、それは引数を挿入していません。あなたはこれを必要とします

return ($this->expr("if([subselect] is null, 'N','Y')")->setCustom('subselect'=>$select));

参照:http ://agiletoolkit.org/doc/dsql/expr

注:これは文字列を返しません。DSQLクエリを返します。

あなたの質問に答えるには:

デフォルトでは、where()は2番目の引数をパラメーターとして扱い、それをパラメトリック変数に追加します。弦にキャストするときに緩めます。単一の引数を指定すると、パラメーターは使用されず、完全に機能するクエリが得られます。

于 2012-08-28T02:11:43.570 に答える