【问题标题】:doctrine2 native query update statement学说2本机查询更新语句
【发布时间】:2011-09-21 14:51:21
【问题描述】:

如何在 Doctrine 2 中进行原生 sql 查询,执行更新语句? EntityManager 上的 createNativeQuery 方法需要第二个参数 (ResultSetMapping) 才能将结果集映射到对象。

但是在更新(或插入、设置或...)时,没有要映射的结果集。 传递 null 或只传递 new ResultSetMapping(),会报错。

本机 sql 是否仅支持选择查询?

【问题讨论】:

    标签: php doctrine-orm native


    【解决方案1】:

    基本上同上 w/faken,

    来自docs

    如果你想执行 DELETE、UPDATE 或 INSERT 语句,Native SQL API 无法使用,可能会抛出错误。采用 EntityManager#getConnection() 访问本机数据库连接 并为这些查询调用 executeUpdate() 方法。

    一个使用说明是连接对象可以从EntityManager中获取:

    $conn = $entityManager->getConnection();
    $rowsAffected = $conn->executeUpdate($sql, $params, $types);
    

    【讨论】:

      【解决方案2】:

      更新语句通常非常简单,因此您不妨使用普通的 Doctrine2 方式(即以编程方式更新实体并调用 EntityManager::flush() 或使用 DQL Updates)。

      话虽如此,如果你真的想使用普通的 SQL,你总是可以这样做:

      1. 保留与 Doctrine2 创建连接时获得的 db connection object

        $connection = \Doctrine\DBAL\DriverManager::getConnection($dbConfig->toArray(),null,$evm);

      2. 使用connection 对象中的可用方法执行您想要的任何SQL,例如:

        $connection->executeUpdate($sql, $params, $types); $connection->exec($sql); ...

      【讨论】:

      • 我想根据其他字段之一的顺序更新所有记录的排名字段。类似于:设置@rank := 0; INSERT INTO rank (id, rank) SELECT id, @rank := @rank+1 FROM ranked ORDER BY score DESC ON DUPLICATE KEY UPDATE rank = @rank;不要认为使用 DQL 可以做到这一点?
      • 这是一个不同的问题,我没有完全理解这么短的评论;我建议您打开另一个问题,但提供更多详细信息。尽管如此,如果您知道如何在 SQL 中执行此 UPDATE,您始终可以使用我为您的原始问题提供的答案,这将起作用。
      猜你喜欢
      • 2011-12-04
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多