У меня есть следующий образец класса, который сопоставляется с таблицей MySql (показано ниже). Когда я использую PDO :: FETCH_CLASS и делаю * var_dump *, я вижу, что отображение относится ко всем свойствам нижнего регистра. т.е. «shortName» отображает «shortname», но должно быть «shortName» (случай верблюда, как и определенное свойство);
Почему он сопоставляет все строчные буквы и что я могу сделать, чтобы сопоставить их с точным именем sql, исходящим из SELECT?
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"); } }
Измените это:
$db = ezcDbInstance::get(); $stmt = $db->prepare('SELECT...
к этому:
$db = ezcDbInstance::get(); $db->setAttribute( PDO::ATTR_CASE, PDO::CASE_NATURAL ); $stmt = $db->prepare('SELECT ...
Похоже, что PDO не поддерживает прописные буквы для переменных-членов.
В качестве альтернативы я предлагаю вам сопоставить данные из базы данных с частными членами вашего класса, и вы предоставляете getter и seters для доступа к ним:
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; } ... }
Это позволяет вам сопоставлять поля независимо от их имени, и вы можете контролировать, можно ли написать правду или нет (например, идентификатор). В любом случае, они не должны быть общедоступными.
Вы можете улучшить это, перемещая код доступа к данным в базовый класс и расширяясь от него для своих классов данных, таких как Категория, или же они будут называться.