[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Шаблон GenericObject
Timok
Вообщем шаблон взят из книжки. Общий смысл: работаем с каждой записью таблицы как с отдельным объектом.
При создании объекта указываем id записи в таблице (если не указать - работаем как с новой записью)
PHP
  1. $record = new GenericObject('sometable', 1); // запись id=1 таблицы `sometable`

запрос на выборку всех аттрибутов записи содержится в скрытом методе (reload) и делается при вызове методов: getField, setField, save.
Вот не нравиться мне то, что если я хочу получить значение только одного поле записи, выбираются все поля. Т.е. если мне нужно
PHP
  1. print $record->getField('name'); // вывести значение поля name

из таблицы всё равно выбираются все поля. Т.к. функция отвечающая за выборку данных одна reload() и одна загружает все поля.

Вопрос: как это может сказаться на производительности? Может лучше сделать отдельный запрос на выборку для каждого поля отдельно (в методе getField) ?

Ниже сам код класса
PHP
  1. <?php
  2. require_once('class.database.php');
  3. // код класса Database опущен, т.к. имхо и так понятно что в нём
  4.  
  5. class GenericObject {
  6.  
  7. private $db;
  8. private $id;
  9. private $table_name;
  10. private $table_fields = array();
  11. private $loaded;
  12. private $modified;
  13. private $modified_fields = array();
  14.  
  15. public function __construct($table_name, $id = false) {
  16. $this->db = Database::instance();
  17. $this->table_name = $table_name;
  18. $this->id = $id;
  19. }
  20.  
  21. private function reload() {
  22. if (! $this->id) {
  23. return false;
  24. }
  25. $id = $this->id;
  26. $table_name = $this->table_name;
  27. $db = $this->db;
  28. if (! is_numeric($id)) {
  29. $id = "'$id'";
  30. }
  31. list($this->table_fields) = $db->select("SELECT * FROM `$table_name` WHERE `id`=$id");
  32. $this->loaded = true;
  33. if (sizeof($this->modified_fields) > 0) {
  34. foreach ($this->modified_fields as $field => $value) {
  35. $this->modified_fields[$field] = $value;
  36. }
  37. }
  38. }
  39. // "альтернативный вход" в reload()
  40. private function load() {
  41. $this->reload();
  42. $this->loaded = true;
  43. }
  44.  
  45. public function getID() {
  46. return $this->id;
  47. }
  48.  
  49. public function getField($field) {
  50. if ((! $this->loaded) && ($this->id)) {
  51. $this->load();
  52. }
  53. if (array_key_exists($field, $this->table_fields)) {
  54. return $this->table_fields[$field];
  55. } else {
  56. return false;
  57. }
  58. }
  59.  
  60. public function setField($field, $value) {
  61. if (! $this->loaded) {
  62. $this->load();
  63. }
  64. $this->table_fields[$field] = $value;
  65. $this->modified = true;
  66. $this->modified_fields[$field] = true;
  67. }
  68.  
  69. // Удаление строки из таблицы - в случае успеха вернёт 1, иначе - 0
  70. public function destroy() {
  71. if ($this->id) {
  72. $condition = array('id' => $this->id);
  73. return $this->db->delete($this->table_name, $condition);
  74. }
  75. }
  76.  
  77. public function save() {
  78. $id = $this->id;
  79. $table_name = $this->table_name;
  80. $db = $this->db;
  81. if (! $id) {
  82. $this->loaded = false;
  83. }
  84.  
  85. // Формируем массив поле-значение
  86. $record = array();
  87. foreach ($this->table_fields as $field => $value) {
  88. if ((! is_numeric($field)) && $value) {
  89. $record[$field] = $value;
  90. }
  91. }
  92.  
  93. if (! $this->loaded) {
  94. // Новая сущность - INSERT
  95. $affected_rows = $db->insert($table_name, $record);
  96. $this->id = $db->getLastID();
  97. } else {
  98. // Изменение сущности - UPDATE
  99. $condition = array('id' => $id);
  100. $affected_rows = $db->update($table_name, $record, $condition);
  101. }
  102. return $affected_rows;
  103. }
  104.  
  105. }
  106. ?>




Спустя 8 минут, 31 секунда (10.02.2007 - 14:37) Ghost написал(а):
клас решает определенный круг задач, если тебе часто приходится выбирать только некоторые поля из большой (по структуре) таблицы - добавь метод reloadFilds($fildsArray)

Спустя 7 месяцев, 2 дня, 4 часа, 25 минут, 7 секунд (12.09.2007 - 18:02) SirJay написал(а):
Цитата(PantiL @ 2.2.2007, 17:55) [snapback]12150[/snapback]
ИМХО реальное извращение smile.gif сам понял что написал?

Хороша веревка длинная, а программа короткая smile.gif - я даже разбираться не стал, уж больно много лишнего кода для Хелло Мир


Да без базара сейчас сохраню себе на хард поситаю код а завтра попытаюсяь дать идею...

Спустя 1 месяц, 17 дней, 2 часа, 1 минута, 57 секунд (29.10.2007 - 21:04) sm.hermes написал(а):
Класс хороший и юзабельный. Но вот производителность... насколько я знаю производительность зависит от количества запросов. Посчитай сколько запросов у тебя будет так, и сколько через класс. Где меньше там и юзай.
Но грубо говоря генерация страницы должна укладываться в 0.4 с. Если с классом укладываешься - переписывай под себя и юзай.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.