【问题标题】:php PDO::FETCH_CLASS is mapping to all lowercase properties instead of camelCasephp PDO::FETCH_CLASS 映射到所有小写属性而不是 camelCase
【发布时间】:2012-03-15 09:09:54
【问题描述】:

我有以下映射到 MySql 表的示例类(如下所示)。当我使用 PDO::FETCH_CLASS 并执行 *var_dump* 时,我看到映射将转到所有小写属性。即“shortName”映射到“shortname”,但应该是“shortName”(驼峰式大小写,如定义的属性);

为什么它映射到所有小写字母,我该怎么做才能将它们映射到来自 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");
  }
}

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    改变这个:

    $db = ezcDbInstance::get();
    
    $stmt = $db->prepare('SELECT...
    

    到这里:

    $db = ezcDbInstance::get();
    $db->setAttribute( PDO::ATTR_CASE, PDO::CASE_NATURAL );
    
    $stmt = $db->prepare('SELECT ...
    

    【讨论】:

    • 您可能希望将 setAttribute 放在 execute() 调用之前,因为这是该属性真正影响的内容。
    【解决方案2】:

    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)。无论如何,这些都不应该公开。

    您可以通过将数据访问代码移动到基类中并从它扩展为您的数据类(如 Category 或它们将被命名)来进一步改进这一点。

    【讨论】:

    • 我最终做了什么。欢迎其他人提供更多想法,但我现在将其标记为答案。
    • 您可能会发现Patterns of Enterprise Application Architecture 很有见地。不止一章是关于如何使用不同类型的抽象和映射将数据库和应用程序结合在一起的。
    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多