【问题标题】:Doctrine 2 DBAL and QueryBuilder - It really works?Doctrine 2 DBAL 和 QueryBuilder - 它真的有效吗?
【发布时间】:2017-12-17 00:38:01
【问题描述】:

我以 Doctrine DBAL 在线文档为例:

$queryBuilder
    ->select('id', 'name')
    ->from('users')
    ->where('email = ?')
    ->setParameter(0, $userInputEmail);

第一个问题:

当我打电话给:

$sql = $queryBuilder->getSQL();

我希望返回带有指定参数的完整且有效的 SQL 查询;不幸的是,情况并非如此,我返回的查询仍然带有问号;这正常吗?

第二个问题:

我不清楚(阅读文档)如何准确地使用查询生成器来检索结果;一个实际的样本可能会为我指明正确的方向。

我遇到以下类似问题:

$DBQB
        ->insert('core_users')
        ->values(
                array(
                    'username' => $SETUP['admin']['username'],
                    'secret' => hash($SETUP['util']['hashalgo'], $SETUP['admin']['passwd'])
                )
                );

->GetSQL() 没有返回有效的 SQL 查询:

INSERT INTO core_users (username, secret) VALUES(qsecofr, b7...);

显然这会导致我出错。

感谢您的回答。

注意:这是doctrine dbal querybuilder as prepared statement的一个非常相似的问题,但前者没有得到答案......

【问题讨论】:

标签: php doctrine-orm


【解决方案1】:

完全正常。准备好的语句的本质是 sql 是独立于实际值发送到数据库服务器的。两者始终分开,并在数据库级别合并;因此getSQLfrom Doctrine 无法返回完全编译的 SQL 查询。

文档没有执行查询的实际示例有点奇怪。

我个人不是 QueryBuilder::setParameter 的忠实粉丝。相反,我这样做:

$queryBuilder = $conn->createQueryBuilder();
$queryBuilder
    ->select('id', 'name')
    ->from('users')
    ->where('email = ?');

$stmt = $conn->executeQuery($queryBuilder->getSQL(),[$userInputEmail]);
$user = $stmt->fetch();

只需要发送一个值数组,其顺序与您的参数顺序相匹配。作为奖励,您可以为 WHERE xxx IN(?) 发送一个数组。准备好的语句通常无法处理的东西。

就插入内容而言,我认为您可能想多了。连接对象支持插入、更新和删除,无需查询构建器。

$conn->insert('core_users',['username'=>'DTrump','secret='Putin']);

==================================

这是一个使用 setParameter 的工作示例

    $qb
        ->select('projectId','gameNumber','fieldName')
        ->from('games')
        ->where('gameNumber = ?')
        ->setParameter(0,11457);

    $stmt = $qb->execute();

    dump($stmt->fetchAll());

【讨论】:

  • 感谢您的回答;它解决了我的问题,尽管我仍然想念为什么 setParameter 方法不起作用......
  • 它确实有效,只是不像您认为的那样。 $qb->execute 应该可以正常运行查询。
  • 嗯,你能指出一个完整的例子吗?只是为了获取全貌。
猜你喜欢
  • 2012-07-03
  • 2017-02-25
  • 2014-04-30
  • 2016-08-25
  • 1970-01-01
  • 2017-06-10
  • 2014-01-27
  • 2011-04-06
  • 2012-05-22
相关资源
最近更新 更多