2016-05-23 99 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()'方法,以便將我的表名與我的對象屬性進行關聯。 –