php PDO :: FETCH_CLASS映射到所有小写属性而不是camelCase

时间:2012-02-24 22:16:19

标签: php mysql pdo

我有以下映射到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");
  }
}

2 个答案:

答案 0 :(得分:4)

改变这个:

$db = ezcDbInstance::get();

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

到此:

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

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

答案 1 :(得分: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)。这些不应该是公开的。

您可以进一步改进这一点,方法是将数据访问代码移动到基类中,然后从它扩展到类别等数据类,或者将它们命名。