【问题标题】:Calling PostgreSQL Stored Procedures and Functions from Symfony 5 using Doctrine使用 Doctrine 从 Symfony 5 调用 PostgreSQL 存储过程和函数
【发布时间】:2020-07-10 11:16:46
【问题描述】:

看了很多地方,连Doctrine的官方文档都不再能通过Doctrine在Symfony中调用数据库(我这里是PostgreSQL)的存储过程和函数了。

例如,假设我想在 PosgresSQL 中执行一个简单的 greeting() 函数,该函数总是返回一个 "Hello" 并且我想从 Symfony 执行等效的操作“SELECT id, username, greeting () FROM user”。我打算在屏幕上以 3 列的列表显示此查询的结果。编辑某些行时,将第一行和第二行保留在数据库中。第三个,因为它是一个计算列。

显然,在现实世界中,函数会稍微复杂一些。我只是想了解如何处理对存储在数据库中的函数和过程的调用。由于我开始的项目将不得不使用复杂而密集的基础计算。

正如我所说,在咨询后我想知道解决方案是否是使用Native SQL and ResultSetMapping from Doctrine。这是唯一接近解决我的问题的事情。我认为它有点复杂,我认为必须有一些更简单的方法来解决它。来吧,我想相信这很普遍,一定有更简单的解决方案。

有人可以指导我吗?

我为我的英语道歉。我用过谷歌翻译服务。我的母语是西班牙语。

【问题讨论】:

  • 有一个扩展beberlei/doctrineextensions 将内置函数添加到教义(用于 sql/dql 解析器)。您可以以相同的方式添加您的存储功能。或者(在这个特定的用例中可能更容易),您可以只使用pdo connection via $em->getConnection(),然后只需执行您的 sql 查询,而无需任何学说验证。 (另见:php.net/pdo
  • 附录:如果你想水合实体对象,你只需要原生查询 + 结果集映射,我假设你不需要。在没有任何实体的情况下使用连接可能更适合......但是你失去了与学说/symfony 的集成(查询可能不会出现在探查器中)

标签: postgresql symfony doctrine-orm doctrine


【解决方案1】:

我可能误解了这个问题,但对我来说似乎很简单:

$conn = $this->getDoctrine()->getConnection();
$stmt = $conn->prepare('SELECT * FROM "myFunctionName"(:p1, :p2)');
$stmt->bindParam(':p1', $one);
$stmt->bindParam(':p2', $two);
$result = $stmt->executeQuery()->fetchAssociative();

在函数周围加上引号以说明函数名称中的大写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多