PHPPDO::FETCH_类映射到所有小写属性,而不是camelCase
我有以下映射到MySql表的示例类(如下所示)。当我使用PDO::FETCH_类并执行*var_dump*时,我看到映射将指向所有小写属性。i、 e.“shortName”映射为“shortName”,但应为“shortName”(驼峰大小写,与定义的属性类似) 为什么它要映射到所有小写字母,我该如何将它们映射到来自SELECT的确切sql名称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
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 ...
和我最后做的差不多。欢迎来自其他人的更多想法,但我现在将此标记为答案。您可能会发现见解深刻。不止一章介绍了如何将数据库和应用程序结合在一起,以及不同类型的抽象和映射。欢迎来自其他人的更多想法,但我现在将此标记为答案。您可能会发现见解深刻。不止一章介绍了如何将数据库和应用程序结合在一起,以及不同类型的抽象和映射。