2012-08-27 31 views
1

嗨我正在用Agile Toolkit編寫一些DSQL查詢,但有點困惑。鑑於以下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'); 

謝謝!

回答

0

更新: DSQL已經重構爲一個獨立的庫:git.io/dsql

$選擇代表$ DSQL對象既包含查詢和參數。當你將它轉換成字符串時,它不會插入參數。你需要這個

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

參見:http://agiletoolkit.org/doc/dsql/expr

注意:這不返回字符串,它返回DSQL查詢。

要回答你的問題:

默認情況下,其中()把第二個參數作爲參數,並將其添加到參變量。鑄造成絃樂時你會鬆動它。如果您指定單個參數,則不使用任何參數,並且您將獲得完整的查詢。

+0

謝謝@romaninsh - 奇妙的框架!如果我有更多問題,我明天會試試,並告訴你。 –

+0

我收到500錯誤。查看代碼示例的更新答案。 –

+0

This works: return($ select-> expr(「if([subselect] is null,'N','Y')」) - > setCustom('subselect',$ select)); –