From: Michael Wallner Date: Tue, 12 Mar 2013 07:35:49 +0000 (+0100) Subject: flush X-Git-Tag: v1.0.0~8 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=5c1b63644ccb9277f4dec5e8a14ab6592f1677c5;p=m6w6%2Fpq-gateway flush --- diff --git a/lib/pq/Gateway/Cell.php b/lib/pq/Gateway/Cell.php index efa5fcb..33f94c8 100644 --- a/lib/pq/Gateway/Cell.php +++ b/lib/pq/Gateway/Cell.php @@ -48,6 +48,14 @@ class Cell extends Expressible * @return \pq\Gateway\Cell */ function set($data) { + if ($data instanceof Row) { + $this->row->__set($data->getTable()->getName() . "_id", $data->id); + $this->row->__unset($this->name); + return $this; + } + if ($data instanceof Cell) { + $data = $data->get(); + } parent::set($data); $this->dirty = true; return $this; diff --git a/lib/pq/Gateway/Row.php b/lib/pq/Gateway/Row.php index e408430..5b438e5 100644 --- a/lib/pq/Gateway/Row.php +++ b/lib/pq/Gateway/Row.php @@ -43,13 +43,40 @@ class Row implements \JsonSerializable $that->data = $data; return $that->prime(); } + + /** + * Export current state as an array + * @return array + * @throws \UnexpectedValueException if a cell has been modified by an expression + */ + function export() { + $export = array_merge($this->data, $this->cell); + foreach ($export as &$val) { + if ($val instanceof Cell) { + if ($val->isExpr()) { + throw new \UnexpectedValueException("Cannot export an SQL expression"); + } + $val = $val->get(); + } + } + return $export; + } + /** + * Export current state with security sensitive data removed. You should override that, just + * calls export() by default. + * @return array + */ + function exportPublic() { + return $this->export(); + } + /** * @implements JsonSerializable * @return array */ function jsonSerialize() { - return $this->data; + return $this->exportPublic(); } /** @@ -126,9 +153,13 @@ class Row implements \JsonSerializable /** * Get a cell * @param string $p - * @return \pq\Gateway\Cell + * @return \pq\Gateway\Cell|\pq\Gateway\Rowset */ function __get($p) { + if (isset($this->data["{$p}_id"])) { + // FIXME cache + return $this->getTable()->by($this, $p); + } if (!isset($this->cell[$p])) { $this->cell[$p] = new Cell($this, $p, isset($this->data[$p]) ? $this->data[$p] : null); } @@ -141,7 +172,16 @@ class Row implements \JsonSerializable * @param mixed $v */ function __set($p, $v) { - $this->__get($p)->set(($v instanceof Cell) ? $v->get() : $v); + $this->__get($p)->set($v); + } + + function __unset($p) { + unset($this->data[$p]); + unset($this->cell[$p]); + } + + function __isset($p) { + return isset($this->data[$p]) || isset($this->cell[$p]); } /** diff --git a/lib/pq/Gateway/Table.php b/lib/pq/Gateway/Table.php index 2e82a21..7966911 100644 --- a/lib/pq/Gateway/Table.php +++ b/lib/pq/Gateway/Table.php @@ -37,13 +37,20 @@ class Table */ protected $exec; + /** + * @var array + */ + protected $dependents; + /** * @param string $name * @param \pq\Connection $conn + * @param array $dependents */ - function __construct($name, \pq\Connection $conn = null) { + function __construct($name, \pq\Connection $conn = null, array $dependents = array()) { $this->name = $name; $this->conn = $conn ?: static::$defaultConnection ?: new \pq\Connection; + $this->dependents = $dependents; } /** @@ -172,6 +179,43 @@ class Table $query->write("OFFSET", $offset); return $this->execute($query); } + + /** + * Get the parent row of a row by foreign key + * @param \pq\Gateway\Row $dependent + * @param string $name optional fkey name + * @param string $order + * @param int $limit + * @param int $offset + * @return mixed + */ + function of(Row $dependent, $name = null, $order = null, $limit = 0, $offset = 0) { + if (!$name) { + $name = $dependent->getTable()->getName(); + } + return $this->find(array("{$name}_id=" => $dependent->id), + $order, $limit, $offset); + } + + /** + * Get the child rows of a row by foreign key + * @param \pq\Gateway\Row $me + * @param string $dependent + * @param string $order + * @param int $limit + * @param int $offset + * @return mixed + * @throws \LogicException + */ + function by(Row $me, $dependent, $order = null, $limit = 0, $offset = 0) { + if (!isset($this->dependents[$dependent])) { + throw new \LogicException("Unknown dependent table $dependent"); + } + + $dependentClass = $this->dependents[$dependent]; + $dependentModel = new $dependentClass($this->conn); + return $dependentModel->of($me, null, $order, $limit, $offset); + } /** * Insert a row into the table