1

嗨,我正在使用 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');

谢谢!

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() 将第二个参数视为参数并将其添加到参数变量中。投射到字符串时会松开它。如果您指定单个参数,则不使用任何参数,您将获得一个完整的查询。

于 2012-08-28T02:11:43.570 回答