【问题标题】:How To Utilize Doctrine2 Type Conversion on Native Query COLUMNS如何在 Native Query COLUMNS 上使用 Doctrine2 类型转换
【发布时间】:2012-07-14 12:50:23
【问题描述】:

在这方面找不到任何东西——不过看起来应该是直截了当的。

因此,Doctrine2 文档给出的绑定参数类型转换的示例如下所示:

$date = new \DateTime("2011-03-05 14:00:21");
$stmt = $conn->prepare("SELECT * FROM articles WHERE publish_date > ?");
$stmt->bindValue(1, $date, "datetime");
$stmt->execute();

我想做的是为其中一列指定类型转换,但在文档或 StackOverflow 上我找不到任何东西。这可能看起来像一个伪示例:

$stmt = $conn -> prepare("SELECT datetime FROM articles WHERE id = 1");
$stmt -> setType(0, "date_type"); // 0 being the column position, "date_type" being the PHP type to convert to

如果有人知道如何执行此操作(这是 SQL 而不是 DQL),我将不胜感激。谢谢。

【问题讨论】:

  • 请问您是如何解决这个问题的?我将 Silex 与普通 DBAL 适配器一起使用,所有获取的列都作为字符串返回。有没有找到比手动迭代+转换更短的解决方案?

标签: doctrine-orm type-conversion native-sql


【解决方案1】:

这不适用于 DBAL 级别。如果您在 ORM 中使用 NativeSQL 查询,则可以通过使用 HYDRATE_ARRAY 模式并将一些获取的字段映射到实体来通过水合(参见 NativeSQL section in the Doctrine ORM documentation)获得这种转换。最快的解决方案(如果您不打算使用 ORM)是遍历结果并通过访问 Doctrine\DBAL\Types\Type::getType($someType)->convertToPhpValue($fetchedValue) 手动应用类型转换。能够指定第三个参数来说明在Doctrine\ORM\Query\ResultSetMapping#addScalarResult 中获取的类型,这可能是对 ORM 的一个有价值的补充。

【讨论】:

  • 感谢您的澄清。我讨厌 ResultSetMapping 功能。我发现它非常无用和霸道到使用 ORM 的地步。我主要只将 ORM 功能用于 INSERT / UPDATE 操作。我相信对于简单的数据检索,您应该使事情尽可能简单。
  • 嗯,事实是你需要一个水合器在中间,水合器需要一个配置(在本例中为ResultSetMapping)。这也适用于 TableGateway 和 ActiveQuery 或任何你想使用的东西:)
  • 在我的例子中,我不想/不需要水合步骤,因为我想要做的只是得到一堆可以正确类型转换的标量值。我希望能够手动指定类型转换并完全绕过 ORM 以简单地检索标量值。就 RSM 功能而言,如果您想将自定义查询转换为对象图结果,我意识到这是必要的,但我仍然讨厌它。
  • convertToPhpValue 需要两个参数,第二个是平台。可以从$connection->getDatabasePlatform()获得它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2019-06-07
  • 2021-03-03
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多