PHPPDO::FETCH_类映射到所有小写属性,而不是camelCase

PHPPDO::FETCH_类映射到所有小写属性,而不是camelCase,php,mysql,pdo,Php,Mysql,Pdo,我有以下映射到MySql表的示例类(如下所示)。当我使用PDO::FETCH_类并执行*var_dump*时,我看到映射将指向所有小写属性。i、 e.“shortName”映射为“shortName”,但应为“shortName”(驼峰大小写,与定义的属性类似) 为什么它要映射到所有小写字母,我该如何将它们映射到来自SELECT的确切sql名称 class Category { public $id; public $fkId; public $shortName; publi

我有以下映射到MySql表的示例类(如下所示)。当我使用PDO::FETCH_类并执行*var_dump*时,我看到映射将指向所有小写属性。i、 e.“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");
  }
}

看起来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)进行扩展,或者根据它们的命名方式进行扩展,从而进一步改进这一点。

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)或它们的命名方式来进一步改进此功能。

更改此选项:

$db = ezcDbInstance::get();

$stmt = $db->prepare('SELECT...
为此:

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

$stmt = $db->prepare('SELECT ...
更改此项:

$db = ezcDbInstance::get();

$stmt = $db->prepare('SELECT...
为此:

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

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

和我最后做的差不多。欢迎来自其他人的更多想法,但我现在将此标记为答案。您可能会发现见解深刻。不止一章介绍了如何将数据库和应用程序结合在一起,以及不同类型的抽象和映射。欢迎来自其他人的更多想法,但我现在将此标记为答案。您可能会发现见解深刻。不止一章介绍了如何将数据库和应用程序结合在一起,以及不同类型的抽象和映射。