193 lines
5.1 KiB
PHP
193 lines
5.1 KiB
PHP
<?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;
|
|
}
|
|
|
|
}
|