2013-08-23 132 views
0

我试图创建一个Doctrine DBAL querybuilder对象并在其中设置一个参数。 (使用一个Postgres数据库,DBAL 2.3.4,学说doctrine dbal querybuilder as prepared statement

$connection = $this->_em->getConnection(); 
$qb = $connection->createQueryBuilder(); 
$qb->select('tbl_user_contract.pkid AS pkid'); 
$qb->from('tbl_user_contract', 'tbl_user_contract'); 
$qb->join('tbl_user_contract', 'tbl_user', 'tbl_user', 'tbl_user_contract.fk_user = tbl_user.pkid'); 
$qb->where('tbl_user.pkid = :userid'); 
$qb->setParameter(':userid', 10); 

当我试图让这个QueryBuilder的对象,我得到以下错误的结果:

SQLSTATE[08P01]: <<Unknown error>>: 7 ERROR: bind message supplies 0 parameters, 
but prepared statement "pdo_stmt_00000002" requires 1 

当我检查的Postgres日志,我看到传递的查询,我注意到它期望一个参数,但我不会得到一个参数传入。

我试图设置id表达式本身(不使用预先准备的语句),那工作,但我真的希望得到这个准备工作红色的陈述。

任何人都知道如何解决这个问题?

在此先感谢

+0

对参数使用'?'通配符,但尝试按名称进行设置。通常你必须使用*命名参数或序数位置参数,而不是混合两者。也许你需要尝试像 '$ qb-> setParameter(1,10);'? (它可能从零或从一开始计数)。我不使用Doctrine或PHP,所以这是未经测试的。 –

+0

对不起,将代码的部分代码复制到stackoverflow时发生了错误。将其更改为两个命名参数,但问题仍然存在。 – user2710303

回答

1

您querybuillder功能的的setParameter一部分是错误的。你不需要:,你可以把它全部放在这样一行中,并且只在FROM语句中包含一个talbe。如果有另一个名为tbl_user的表,并且需要检查实体定义以确保注释是正确的,那么您可能在JOIN或FROM语句中存在问题。

$connection = $this->_em->getConnection(); 
$qb = $connection->createQueryBuilder(); 
$qb->select('tbl_user_contract.pkid AS pkid') 
    ->from('tbl_user_contract') 
    ->join('tbl_user_contract', 'tbl_user', 'tbl_user', 'tbl_user_contract.fk_user = tbl_user.pkid') 
    ->where('tbl_user.pkid = :userid') 
    ->setParameter('userid', 10); 

请参阅这里的文档http://docs.doctrine-project.org/en/latest/reference/query-builder.html#binding-parameters-to-your-query