我有以下映射到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");
}
}
答案 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)。这些不应该是公开的。
您可以进一步改进这一点,方法是将数据访问代码移动到基类中,然后从它扩展到类别等数据类,或者将它们命名。