$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();
}
/**
/**
* 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);
}
* @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]);
}
/**
*/
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;
}
/**
$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