Beispiel #1
0
 /**
  * Save a row
  *
  * @param bool $rePopulate  To re-populate data
  * @param bool $filter Filter invalid columns
  *
  * @return int
  */
 public function save($rePopulate = true, $filter = true)
 {
     $this->initialize();
     /**#@+
      * Encode data to make it db-ready
      */
     $this->data = $this->encode($this->data);
     if ($filter) {
         $columns = $this->columns ?: $this->model->getColumns();
         if ($columns) {
             foreach (array_keys($this->data) as $column) {
                 if (!in_array($column, $columns)) {
                     unset($this->data[$column]);
                 }
             }
         }
     }
     /**#@-*/
     if ($this->rowExistsInDatabase()) {
         // UPDATE
         $data = $this->data;
         $where = array();
         // primary key is always an array even if its a single column
         foreach ($this->primaryKeyColumn as $pkColumn) {
             $where[$pkColumn] = $this->primaryKeyData[$pkColumn];
             if ($data[$pkColumn] == $this->primaryKeyData[$pkColumn]) {
                 unset($data[$pkColumn]);
             }
         }
         $statement = $this->sql->prepareStatementForSqlObject($this->sql->update()->set($data)->where($where));
         $result = $statement->execute();
         $rowsAffected = $result->getAffectedRows();
         unset($statement, $result);
         // cleanup
     } else {
         // INSERT
         $insert = $this->sql->insert();
         $insert->values($this->data);
         $statement = $this->sql->prepareStatementForSqlObject($insert);
         $result = $statement->execute();
         if (($primaryKeyValue = $result->getGeneratedValue()) && count($this->primaryKeyColumn) == 1) {
             $this->primaryKeyData = array($this->primaryKeyColumn[0] => $primaryKeyValue);
         } else {
             // make primary key data available so that
             // $where can be complete
             $this->processPrimaryKeyData();
         }
         $rowsAffected = $result->getAffectedRows();
         unset($statement, $result);
         // cleanup
         $where = array();
         // primary key is always an array even if its a single column
         foreach ($this->primaryKeyColumn as $pkColumn) {
             $where[$pkColumn] = $this->primaryKeyData[$pkColumn];
         }
     }
     if ($rePopulate) {
         // refresh data
         $statement = $this->sql->prepareStatementForSqlObject($this->sql->select()->where($where));
         $result = $statement->execute();
         $rowData = $result->current();
         unset($statement, $result);
         // cleanup
         // make sure data and original data are in sync after save
         $this->populate($rowData, true);
     }
     // return rows affected
     return $rowsAffected;
 }