4

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

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

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

4

2 回答 2

3

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

Doctrine 还支持为您的模型使用视图

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

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

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

于 2016-05-24T07:41:15.500 回答
1

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

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

但是如果你真的想使用 Doctrine,你应该手动创建实体,并使用魔法设置器 - 获取器来处理特殊字段并访问/水合你的实体。

编辑

想象一下你的数据库有一个表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
于 2016-05-23T19:08:35.313 回答