2012-02-24 163 views
2

我有以下示例類映射到MySql表(如下所示)。當我使用PDO :: FETCH_CLASS並執行* var_dump *時,我發現映射將轉到所有小寫屬性。即'shortName'映射到'shortname',但應該是'shortName'(駱駝大小寫,如定義的屬性);php PDO :: FETCH_CLASS映射到所有小寫屬性,而不是camelCase

爲什麼它映射到全部小寫,我該怎麼做才能將它們映射到來自SELECT的確切的SQL名稱?


class Category { 
    public $id; 
    public $fkId; 
    public $shortName; 
    public $longName; 

    public static function getCategories() { 

    $db = ezcDbInstance::get(); 

    $stmt = $db->prepare('SELECT 
           id, 
           fk_id AS `fkId`, 
           short_name AS `shortName`, 
           long_name As `longName` 
          FROM `Category`'); 

    $stmt->execute(); 

    return $stmt->fetchAll(PDO::FETCH_CLASS, "Category"); 
    } 
} 

回答

4

更改此:

$db = ezcDbInstance::get(); 

$stmt = $db->prepare('SELECT... 

這樣:

$db = ezcDbInstance::get(); 
$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL); 

$stmt = $db->prepare('SELECT ... 
0

看起來像PDO不支持成員變量的大寫字母。

作爲替代方案,我建議你從數據庫中的數據映射到類的私有成員,你提供getter和setter方法訪問它們:

class Category 
{ 
    private $shortname; 

    ... 

    public function getShortname() 
    { 
     return $this->shortname; 
    } 

    public function setShortname($name) 
    { 
     $name = (string) $name; 
     if (!$name) 
     { 
      throw new InvalidArgumentException('Can\'t delete the name.'); 
     } 
     $this->shortname = $name; 
    } 

    ... 
} 

這可以讓你的領域,無論映射其名稱,並且您可以控制是否可以寫入樣本(如ID)。無論如何這些都不應該公開。

您可以通過將數據訪問代碼移動到基類中進行進一步改進,並將其擴展到您的數據類(如類別)或將其命名。

+0

差不多就是我終於實現了。歡迎來自其他人的更多想法,但我將此標記爲現在的答案。 – thames 2012-03-09 16:00:16

+0

您可能會發現[企業應用程序架構的模式](http://martinfowler.com/books.html#eaa)洞察力。不止一章是關於如何將數據庫和應用程序集成在一起 - 以及不同類型的抽象和映射。 – hakre 2012-03-10 09:55:54

相關問題