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

时间:2016-05-23 17:54:27

标签: php doctrine-orm zend-framework2 dbal hydration

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

解析错误:语法错误,意外的'$',期待变量(T_VARIABLE in ...

如何为字段名称中带有主题标签的表创建模型?

2 个答案:

答案 0 :(得分:3)

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

Doctrine还支持您的模型the use of views

  

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

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

据我了解,您只使用Doctrine DBAL,但无论如何 here some more information 使用带有学说ORM的MySQL视图,它可能对您或其他人有帮助。

答案 1 :(得分:0)

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

如果您的数据库真的很旧(40岁,omg!),您应该使用DB抽象层/框架,例如 Zend DB (抱歉,您使用的是ZF2)或Aura({ {3}})。

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

修改

想象一下,您的数据库中有一个表Clients和两个字段: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