При создании объекта указываем id записи в таблице (если не указать - работаем как с новой записью)
PHP
$record = new GenericObject('sometable', 1); // запись id=1 таблицы `sometable`
запрос на выборку всех аттрибутов записи содержится в скрытом методе (reload) и делается при вызове методов: getField, setField, save.
Вот не нравиться мне то, что если я хочу получить значение только одного поле записи, выбираются все поля. Т.е. если мне нужно
PHP
из таблицы всё равно выбираются все поля. Т.к. функция отвечающая за выборку данных одна reload() и одна загружает все поля.
Вопрос: как это может сказаться на производительности? Может лучше сделать отдельный запрос на выборку для каждого поля отдельно (в методе getField) ?
Ниже сам код класса
PHP
<?php require_once('class.database.php'); // код класса Database опущен, т.к. имхо и так понятно что в нём class GenericObject { private $db; private $id; private $table_name; private $loaded; private $modified; public function __construct($table_name, $id = false) { $this->db = Database::instance(); $this->table_name = $table_name; $this->id = $id; } private function reload() { if (! $this->id) { return false; } $id = $this->id; $table_name = $this->table_name; $db = $this->db; $id = "'$id'"; } $this->loaded = true; foreach ($this->modified_fields as $field => $value) { $this->modified_fields[$field] = $value; } } } // "альтернативный вход" в reload() private function load() { $this->reload(); $this->loaded = true; } public function getID() { return $this->id; } public function getField($field) { if ((! $this->loaded) && ($this->id)) { $this->load(); } return $this->table_fields[$field]; } else { return false; } } public function setField($field, $value) { if (! $this->loaded) { $this->load(); } $this->table_fields[$field] = $value; $this->modified = true; $this->modified_fields[$field] = true; } // Удаление строки из таблицы - в случае успеха вернёт 1, иначе - 0 public function destroy() { if ($this->id) { return $this->db->delete($this->table_name, $condition); } } public function save() { $id = $this->id; $table_name = $this->table_name; $db = $this->db; if (! $id) { $this->loaded = false; } // Формируем массив поле-значение foreach ($this->table_fields as $field => $value) { $record[$field] = $value; } } if (! $this->loaded) { // Новая сущность - INSERT $affected_rows = $db->insert($table_name, $record); $this->id = $db->getLastID(); } else { // Изменение сущности - UPDATE $affected_rows = $db->update($table_name, $record, $condition); } return $affected_rows; } } ?>
Спустя 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]
ИМХО реальное извращение сам понял что написал?
Хороша веревка длинная, а программа короткая - я даже разбираться не стал, уж больно много лишнего кода для Хелло Мир
Хороша веревка длинная, а программа короткая - я даже разбираться не стал, уж больно много лишнего кода для Хелло Мир
Да без базара сейчас сохраню себе на хард поситаю код а завтра попытаюсяь дать идею...
Спустя 1 месяц, 17 дней, 2 часа, 1 минута, 57 секунд (29.10.2007 - 21:04) sm.hermes написал(а):
Класс хороший и юзабельный. Но вот производителность... насколько я знаю производительность зависит от количества запросов. Посчитай сколько запросов у тебя будет так, и сколько через класс. Где меньше там и юзай.
Но грубо говоря генерация страницы должна укладываться в 0.4 с. Если с классом укладываешься - переписывай под себя и юзай.
Но грубо говоря генерация страницы должна укладываться в 0.4 с. Если с классом укладываешься - переписывай под себя и юзай.