在 Symfony 中使用 Doctrine 的 DBAL 检索布尔值

Posted

技术标签:

【中文标题】在 Symfony 中使用 Doctrine 的 DBAL 检索布尔值【英文标题】:Retrieving boolean values with Doctrine's DBAL in Symfony 【发布时间】:2015-09-13 09:43:52 【问题描述】:

我在 Symfony 项目中使用 DBAL 来访问 mysql 数据库中的数据。当查询带有布尔字段(创建为 tinyint)的表时,我在 php 中得到 tinyint 值,但我想得到布尔值。

不知何故,我想获得与直接使用 Doctrine 相同的映射。

我认为映射转换(从 mysql 到 php)已经在 DBAL 中实现,但我不确定它是否应该以这种方式工作(这一层映射值返回)。

我曾尝试注册如下自定义映射,但没有成功:

    $this->conn->getDatabasePlatform()->registerDoctrineTypeMapping('tinyint', 'boolean'); 

    $sql = "
    SELECT se.survey_id, se.anonymous
      FROM survey_edition se
    ";
    $stmt = $this->conn->prepare($sql);
    $stmt->execute();

    $result = $stmt->fetch();

在这种情况下,'anonymous' 是 Mysql 中的 tinyint(1) 字段,但我希望 $result['anonymous'] 是布尔值而不是整数。

您知道是否可以通过 Doctrine 的 DBAL 从 Mysql 查询中获取 PHP 中的布尔值?

谢谢。

【问题讨论】:

小心,tinyint 甚至 tinyint(1) 可以保存从 -128 到 128 或 0 到 256 的值(如果已签名)。它们不打算用作布尔值。如果您想获取布尔值,则使用布尔值(公平地说,它仍然是一个 tinyint)作为列类型。话虽如此,如果返回值是 1 或 0,php 处理事情的方式,你可以通过 if($var) 或破解你的方式来解决这个问题。 感谢您的回答。是的,我们可以按照您的评论进行 if($var) 操作,但我在想一些更一般的事情,比如向我们用来访问数据的层(在这种情况下是 Doctrine 的 DBAL 层)添加映射,所以它可以适用于所有情况并假设 tinyint 值将映射回布尔值。 【参考方案1】:

如果不使用一些ORM,就不能(据我所知)定义模型类型。

解决此问题的方法是遍历数据并转换布尔值,例如:

$item[$i]['foobar'] = (bool)$item[$i]['foobar']

但这甚至不是理想的解决方案。

【讨论】:

好的,谢谢。我们查看了 DBAL 源代码,它在检索数据时基本上调用 PDO 库,并且在迭代结果时没有选项可以连接事件/方法等来转换数据。

以上是关于在 Symfony 中使用 Doctrine 的 DBAL 检索布尔值的主要内容,如果未能解决你的问题,请参考以下文章

Symfony - 使用Doctrine创建复杂查询

在 symfony 中查找当前 Doctrine 数据库连接设置

Symfony 5(Doctrine 2.9),Doctrine 不会为 ManyToOne 自引用关系生成迁移

在 Symfony 应用程序/控制台中启用 Doctrine DBAL 命令

在 Symfony 2 中使用 Doctrine 2 中的视图

Symfony 2:在 ContainerAwareCommand 中禁用 Doctrine 事件监听器