您好我正在使用Agile Toolkit编写一些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 :(得分: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()将第二个参数视为参数并将其添加到参数变量中。你在施放到弦上时会松开它。如果指定单个参数,则不使用任何参数,并且您将获得完全有效的查询。