db = $manager->getDatabase(); $this->manager = $manager; $this->configure(); } protected function createObjectsFromRows($rows) { $objects = array(); foreach ($rows as $row) $objects[] = $this->createObjectFromRow($row); return $objects; } public function save(DataObject $object) { if ($this->getPrimaryKey($object) === null) $this->insert($object); else $this->update($object); } public function fetchByPrimaryKey($primaryKey) { $sql = $this->getQuery()->where("$this->primaryKeyName = ?", $primaryKey)->renderSelectSql(); $row = $this->db->fetchRow($sql, Database::FETCH_TYPE_ROW); if ($row !== null) return $this->createObjectFromRow($row); // TODO use $startColumn return null; } protected function insert(DataObject $object) { $this->db->insert($this->tableName, $this->createAssocFromObject($object)); $this->setPrimaryKey($object, $this->db->insert_id); } protected function update(DataObject $object) { $where = $this->db->quoteInto("$this->primaryKeyName = ?", $this->getPrimaryKey($object)); $this->db->update($this->tableName, $this->createAssocFromObject($object), $where); } public function delete(DataObject $object) { $where = $this->db->quoteInto("$this->primaryKeyName = ?", $this->getPrimaryKey($object)); $this->db->delete($this->tableName, $where); } public function createObjectFromRow(array $row, $startColumn = 0) { $object = $this->createObject(); $this->hydrateObject($object, $row, $startColumn); return $object; } public function getTableColumnNames() { return $this->tableColumnNames; } public function getTableName() { return $this->tableName; } public function getQuery() { $query = new DatabaseQuery($this->db); $query->from($this->tableName, $this->tableColumnNames); return $query; } abstract public function configure(); abstract protected function getPrimaryKey(DataObject $object); abstract protected function setPrimaryKey(DataObject $object, $primaryKey); abstract public function createObject(); abstract public function createAssocFromObject(DataObject $object); abstract public function hydrateObject(DataObject $object, array $row, $startColumn = 0); } interface DataObject { }