为啥 Doctrine Param_str_array 转换没有按预期工作?

Posted

技术标签:

【中文标题】为啥 Doctrine Param_str_array 转换没有按预期工作?【英文标题】:Why Doctrine Param_str_array conversion is not working as expected?为什么 Doctrine Param_str_array 转换没有按预期工作? 【发布时间】:2019-06-23 07:38:12 【问题描述】:

我正在尝试将字符串数组绑定到 where-in 条件。我也使用了参数转换常量。但它似乎不起作用。

以下是我的查询。

$buQuery = "SELECT bu.ID, bu.BUSINESS_NAME FROM business as bu WHERE bu.ID IN (:business)";

$buStmt = self::getConnection($this->entityManager)->prepare($buQuery);

$buStmt->bindValue("business", $business, \Doctrine\DBAL\Connection::PARAM_STR_ARRAY);

$buStmt->execute();

$responseData = $buStmt->fetch();

return $responseData;

我为 in 条件传递的数组是(我已经从参数列表中打印了这个数组并将其复制到这里。)

$business = Array ( 0 => 'mobile', 1 => 'iot' );

教义给我的错误是:

处理时引发异常:执行 SELECT bu.ID, bu.BUSINESS_NAME FROM business as bu WHERE bu.ID IN (:business) 时发生异常,参数为 "[["mobile","iot"]] :" 注意:数组到字符串的转换

我注意到数组没有正确转换。我参考了以下链接,但没有任何帮助。

***link1***link2Doctrinelink1

注意:我也使用了“PARAM_INT_ARRAY”。而且我在绑定语句中将数组作为参数传递时尝试了“array_values”。

【问题讨论】:

您能否尝试将:business 绑定名称重命名为可能从未使用过的名称,例如:businessBindValue @Lunin:值得注意的是。正如我也尝试过的那样。即使我更改绑定值的名称,也会导致相同的错误。 【参考方案1】:

根据official documentation,是因为

参数列表支持仅适用于 Doctrine\DBAL\Connection::executeQuery() 和 Doctrine\DBAL\Connection::executeUpdate(),不适用于预处理语句的绑定方法。

所以你可以只使用这些函数绑定数组,在你的情况下

$stmt = $conn->executeQuery(
    'SELECT bu.ID, bu.BUSINESS_NAME FROM business as bu WHERE bu.ID IN (?)',
    array($business),
    array(\Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
);

【讨论】:

以上是关于为啥 Doctrine Param_str_array 转换没有按预期工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 Doctrine 而不是 CakePHP 的标准数据库 ORM?

为啥这个 Doctrine OneToOne 自引用双向关联不起作用?

为啥 Doctrine Param_str_array 转换没有按预期工作?

为啥 MySQL 不支持毫秒/微秒精度?

Doctrine 2:表单字段显示 Doctrine\Common\Collections\ArrayCollection@00 作为值

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