Doctrine 2 DBAL和QueryBuilder - 它真的有用吗?

时间:2017-07-12 14:12:54

标签: php doctrine-orm

我以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的一个非常相似的问题,但前者也没有得到答案......

1 个答案:

答案 0 :(得分:0)

完全正常。预处理语句的本质是将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());