2012-07-14 48 views
4

找不到任何东西 - 看起来应该是直截了当的。如何在原生查询COLUMNS上使用Doctrine2类型转换

所以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),我将不胜感激。谢谢。

+0

请问你是如何解决这个问题的?我用普通的DBAL适配器使用Silex,所有提取的列都作为字符串返回。你有没有找到任何简短的解决方案,而不是手动迭代+转换? – VisioN 2015-03-06 10:18:42

回答

5

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

+0

感谢您的澄清。我讨厌ResultSetMapping功能。我发现它使用ORM非常无用和咄咄逼人。我主要只使用ORM功能来进行INSERT/UPDATE操作。我相信对于简单的数据检索,您应该尽可能简单。 – 2012-07-16 00:35:11

+0

事实上,你需要一个中间的水化器,而水化器需要一个配置(在本例中为'ResultSetMapping')。这也适用于TableGateway和ActiveQuery或任何你想使用:) – Ocramius 2012-07-18 11:45:38

+0

在我的情况下,我不想/需要水合步骤,因为我所要做的就是获得一堆标量值,这将是正确的类型转换。我希望能够手动指定类型转换并完全绕过ORM以简单检索标量值。就RSM功能而言,我意识到如果您想将自定义查询转化为对象图结果,但我仍然讨厌它,这是必要的。 – 2012-07-19 18:07:18