2016-05-23 96 views
4

我试图实现使用Doctrine DBAL交互的模型/映射器类型,但遇到了几个问题。我的一些列名最后有一个'#'。更改名称不是一个选项。 $ {'COL1#'}语法适用于常规变量,但PHP似乎很难用作对象属性。Doctrine DBAL - >执行()和水化与DB2字段名称,包括'#'

解析错误:语法错误,意想不到的“$”,期待变量(T_VARIABLE在...

我怎么能与在字段名称包括hashtag表的模型

+0

问题1:您是否配置了Doctrine实体? 问题2:您是否尝试使用'Zend \ Stdlib \ Hydrator \ ClassMethods'水化器为实体提供水合物? – ceadreak

+0

@ceadreak由于这个问题,我开始使用Doctrine实体,但这些数据库表已有近40年的历史,关系几乎不存在。另外,我们有一些开发人员不使用PHP(其他语言但是相同的表格),我不能指望他们记得在他们对数据库进行更改的情况下更改实体。所以我相信实体是不可能的。至于'ClassMethods'我用它来保湿,但我仍然需要遍历每一行。 –

+0

你不能在MySQL中创建视图并将你的列重命名为更友好的东西(没有'#')...?学说支持为您的模型使用视图。 – Wilt

回答

3

你可以create views in MySQL和你列重命名为在这些意见中更友好(somethi ng没有#)...?像这样,您不必更改原始表格,但仍可以解决这些命名问题。

原则还支持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...

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

正如我你只使用学说DBAL,但无论如何here some more information使用教义ORM MySQL的观点的理解,它可能是有帮助的(给您或他人)。

+0

谢谢,这不是我最终选择的解决方案,但它仍然是解决问题的可能方案。这就是为什么我将此标记为答案。 –

0

我不?如果你的数据库真的很旧(40岁,omg!),你应该使用一个DB抽象层/框架,如 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 
+0

谢谢你,我使用Doctrine DBAL而不是Doctrine ORM。我认为我可以使用'Zend \ DB'和'Zend \ Db \ ResultSet \ HydratingResultSet'来代替,但这仍然会循环遍历结果集两次。我并没有真正问到我的特殊情况。我只是好奇,如果每个人在使用水化器时两次循环查询结果,或者有其他方法/技巧我不知道。循环播放两次似乎很愚蠢,但也许一般概念是,有一个模型是值得的额外开销。 –

+0

这取决于您的结果集...如果它是一个对象或数组,那么您可以轻松使用ClassMethods水化器。但你不需要在这种情况下使用Doctrine。从实体创建模式是不可能的,也不可能从模式创建伟大的实体...我更新了我的答案,以向您展示实体和ClassMethods水合作用的例子。希望它能帮助 – ceadreak

+0

ClassMethods无法处理hashtag。我必须使用'Zend \ Stdlib \ Hydrator \ ArraySerializable'并配置我的'exchangeArray'和'getArrayCopy()'方法,以便将我的表名与我的对象属性进行关联。 –