原则 DBAL ->execute() 和 Hydration 与 DB2 字段名称包括'#'



我正在尝试使用Doctrine DBAL实现模型/映射器类型的交互,但遇到了一些问题。我的一些列名末尾有一个"#"。更改名称不是一种选择。${'COL1#'} 语法适用于常规变量,但 PHP 在用作对象属性时似乎很难。

解析错误:语法错误、意外的"$"、预期变量 (T_VARIABLE

...

如何为字段名称中包含井号标签的表提供模型?

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

原则还支持对模型使用视图。

许多数据库支持对语义映射到某些表的视图执行所有 CRUD 操作。您可以为所有有问题的表和列名创建视图,以便...

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

据我了解,您只使用Doctrine DBAL,但无论如何,这里有一些关于将MySQL视图与doctrine ORM一起使用的更多信息,这可能会有所帮助(对您或其他人)。

我不认为在没有实体的情况下使用教义有什么意义。

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

但是,如果您真的想使用Doctrine,则应手动创建实体,并使用魔术设置器-getter来处理特殊字段并访问/补水您的实体。

编辑

假设您的数据库有一个表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

相关内容

  • 没有找到相关文章