Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
194 lines (170 sloc) 5.11 KB
<?php
/** Single row representation
*/
class NotORM_Row extends NotORM_Abstract implements IteratorAggregate, ArrayAccess, Countable, JsonSerializable {
private $modified = array();
protected $row, $result, $primary;
/** @access protected must be public because it is called from Result */
function __construct(array $row, NotORM_Result $result) {
$this->row = $row;
$this->result = $result;
if (array_key_exists($result->primary, $row)) {
$this->primary = $row[$result->primary];
}
}
/** Get primary key value
* @return string
*/
function __toString() {
return (string) $this[$this->result->primary]; // (string) - PostgreSQL returns int
}
/** Get referenced row
* @param string
* @return NotORM_Row or null if the row does not exist
*/
function __get($name) {
$column = $this->result->notORM->structure->getReferencedColumn($name, $this->result->table);
$referenced = &$this->result->referenced[$name];
if (!isset($referenced)) {
$keys = array();
foreach ($this->result->rows as $row) {
if ($row[$column] !== null) {
$keys[$row[$column]] = null;
}
}
if ($keys) {
$table = $this->result->notORM->structure->getReferencedTable($name, $this->result->table);
$referenced = new NotORM_Result($table, $this->result->notORM);
$referenced->where("$table." . $this->result->notORM->structure->getPrimary($table), array_keys($keys));
} else {
$referenced = array();
}
}
if (!isset($referenced[$this[$column]])) { // referenced row may not exist
return null;
}
return $referenced[$this[$column]];
}
/** Test if referenced row exists
* @param string
* @return bool
*/
function __isset($name) {
return ($this->__get($name) !== null);
}
/** Store referenced value
* @param string
* @param NotORM_Row or null
* @return null
*/
function __set($name, NotORM_Row $value = null) {
$column = $this->result->notORM->structure->getReferencedColumn($name, $this->result->table);
$this[$column] = $value;
}
/** Remove referenced column from data
* @param string
* @return null
*/
function __unset($name) {
$column = $this->result->notORM->structure->getReferencedColumn($name, $this->result->table);
unset($this[$column]);
}
/** Get referencing rows
* @param string table name
* @param array (["condition"[, array("value")]])
* @return NotORM_MultiResult
*/
function __call($name, array $args) {
$table = $this->result->notORM->structure->getReferencingTable($name, $this->result->table);
$column = $this->result->notORM->structure->getReferencingColumn($table, $this->result->table);
$return = new NotORM_MultiResult($table, $this->result, $column, $this[$this->result->primary]);
$return->where("$table.$column", array_keys((array) $this->result->rows)); // (array) - is null after insert
if ($args) {
call_user_func_array(array($return, 'where'), $args);
}
return $return;
}
/** Update row
* @param array or null for all modified values
* @return int number of affected rows or false in case of an error
*/
function update($data = null) {
// update is an SQL keyword
if (!isset($data)) {
$data = $this->modified;
}
$result = new NotORM_Result($this->result->table, $this->result->notORM);
$return = $result->where($this->result->primary, $this->primary)->update($data);
$this->primary = $this[$this->result->primary];
return $return;
}
/** Delete row
* @return int number of affected rows or false in case of an error
*/
function delete() {
// delete is an SQL keyword
$result = new NotORM_Result($this->result->table, $this->result->notORM);
$return = $result->where($this->result->primary, $this->primary)->delete();
$this->primary = $this[$this->result->primary];
return $return;
}
protected function access($key, $delete = false) {
if ($this->result->notORM->cache && !isset($this->modified[$key]) && $this->result->access($key, $delete)) {
$id = (isset($this->primary) ? $this->primary : $this->row);
$this->row = $this->result[$id]->row;
}
}
// IteratorAggregate implementation
function getIterator() {
$this->access(null);
return new ArrayIterator($this->row);
}
// Countable implementation
function count() {
return count($this->row);
}
// ArrayAccess implementation
/** Test if column exists
* @param string column name
* @return bool
*/
function offsetExists($key) {
$this->access($key);
$return = array_key_exists($key, $this->row);
if (!$return) {
$this->access($key, true);
}
return $return;
}
/** Get value of column
* @param string column name
* @return string
*/
function offsetGet($key) {
$this->access($key);
if (!array_key_exists($key, $this->row)) {
$this->access($key, true);
}
return $this->row[$key];
}
/** Store value in column
* @param string column name
* @return null
*/
function offsetSet($key, $value) {
$this->row[$key] = $value;
$this->modified[$key] = $value;
}
/** Remove column from data
* @param string column name
* @return null
*/
function offsetUnset($key) {
unset($this->row[$key]);
unset($this->modified[$key]);
}
// JsonSerializable implementation
function jsonSerialize() {
return $this->row;
}
}