Doctrine DBAL ->execute() 和 Hydration,DB2 字段名称包括“#”

Doctrine DBAL ->execute() and Hydration with DB2 field names including '#'

我正在尝试使用 Doctrine DBAL 实现 model/mapper 类型的交互,但 运行 有几个问题。我的一些列名称末尾有一个“#”。更改名称不是一种选择。 ${'COL1#'} 语法适用于常规变量,但 PHP 用作对象时似乎很难 属性.

解析错误:语法错误,意外的“$”,需要变量(T_VARIABLE in...

如何为字段名称中带有井号标签的 table 创建模型?

我看不出在没有实体的情况下使用 Doctrine 的意义。

如果你的数据库真的很旧(40 岁,我的天啊!),你应该使用数据库抽象层/框架,例如 Zend DB(抱歉你使用的是 ZF2 ) 或光环 (http://auraphp.com/framework/1.x/en/sql/)。

但如果你真的想使用 Doctrine,你应该手动创建实体,并使用魔法 setters - getters 来处理特殊字段并访问/滋润你的实体。

编辑

假设您的数据库有一个 table Clients 和 2 个字段:idname#1

class Client
{
   protected $id;
   protected $name1;

   public function __set()
   {
       // here you can set unknown properties
       // remove '#' e.g ...
   }

   public function setName1($name1)
   {
       $this->name1 = $name1;

       return $this;
   }

   public function getName1()
   {
       return $this->name1;
   }

   // ... other accessors

}

用法:

$results = clients_query_result ...
$hydrator = new ClassMethods();
$clients = [];

foreach ($results as $result)
{
    $client = new Client();
    $clients[] = $hydrator->hydrate($result, $client);
}

// that's it, now you have a collection of Client objects

您可以 create views in MySQL 并将您的列重命名为在这些视图中更友好的名称(没有 # 的名称)...?这样您就不必更改原始表,但您仍然可以解决这些命名问题。

Doctrine 也支持 the use of views 您的模型。

Many databases support all CRUD operations on views that semantically map to certain tables. You can create views for all your problematic tables and column names to...

他们指的是不同的场景,但使用视图的相同解决方案可能会有所帮助。

据我了解,您只使用 Doctrine DBAL,但无论如何 here some more information 将 MySQL 视图与 Doctrine ORM 结合使用,这可能会有所帮助(以你或其他人)。