簡體   English   中英

Doctrine DBAL - > execute()和Hydration與DB2字段名稱包括'#'

[英]Doctrine DBAL ->execute() and Hydration with DB2 field names including '#'

我正在嘗試使用Doctrine DBAL實現模型/映射器類型的交互,但遇到了一些問題。 我的一些列名最后有一個'#'。 更改名稱不是一種選擇。 $ {'COL1#'}語法適用於常規變量,但PHP在用作對象屬性時似乎很難。

解析錯誤:語法錯誤,意外的'$',期待變量(T_VARIABLE in ...

怎樣才可以有一個表,在字段名稱包括hashtag的模型?

你可以在MySQL中創建視圖,並在這些視圖中將列重命名為更友好的東西(沒有#東西)......? 像這樣,您不必更改原始表,但仍可以解決這些命名問題。

Doctrine還支持為您的模型使用視圖

許多數據庫支持對語義映射到某些表的視圖的所有CRUD操作。 您可以為所有有問題的表和列名創建視圖以...

它們指的是不同的場景,但使用視圖的相同解決方案可能有所幫助。

據我所知,你只使用Doctrine DBAL,但無論如何這里有關於使用帶有學說ORM的MySQL視圖的更多信息 ,它可能對你或其他人有幫助。

我沒有看到沒有實體使用Doctrine的意義。

如果您的數據庫真的很舊(40歲,omg!),您應該使用DB抽象層/框架,例如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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM