use pq\Gateway\Row;
use pq\Mapper\Mapper;
+use pq\Mapper\PropertyInterface;
use pq\Mapper\RefProperty;
use pq\Mapper\RefPropertyInterface;
+use UnexpectedValueException;
class Ref implements RefPropertyInterface
{
use RefProperty;
-
+
+ /**
+ * Create a parent row mapping
+ * @param Mapper $mapper
+ * @param string $property
+ */
function __construct(Mapper $mapper, $property) {
$this->mapper = $mapper;
$this->property = $property;
}
+ /**
+ * Read the parent object
+ * @param Row $row
+ * @param object $objectToUpdate
+ */
function read(Row $row, $objectToUpdate) {
$val = $this->extract($objectToUpdate);
if (!isset($val)) {
}
}
+ /**
+ * Write the parent row's foreign key
+ * @param object $object
+ * @param Row $rowToUpdate
+ * @throws UnexpectedValueException
+ */
function write($object, Row $rowToUpdate) {
$map = $this->mapper->mapOf($this->refClass);
$ref = $this->extract($object);
- $rel = $map->relOf($this->container, $this->refName);
+ if (!$rel = $map->relOf($this->container, $this->refName)) {
+ throw new UnexpectedValueException(
+ sprintf("Unrelated reference from %s to %s with name %s",
+ $this->container->getGateway()->getName(),
+ $map->getGateway()->getName(),
+ $this->refName));
+ }
foreach ($rel as $fgn => $col) {
foreach ($this->findFieldProperty($col) as $property) {
$value = $property->extract($ref);
}
}
+ /**
+ * Find the property exposing $col
+ * @param string $col
+ * @return PropertyInterface[]
+ */
private function findFieldProperty($col) {
$map = $this->mapper->mapOf($this->refClass);
return array_filter($map->getProperties(), function($property) use($col) {
return $property->exposes($col);
});
}
-
-
- function read2(RowGateway $row) {
- #echo __METHOD__." ".$this;
- $map = $this->getRefMap();
- $rel = $this->container->getGateway()->getRelation(
- $map->getGateway()->getName(), $this->refName);
- $key = array_combine($rel->referencedColumns, array_map(function($c) use($row) {
- return $row->$c->get();
- }, $rel->foreignColumns));
- if (($obj = $this->mapper->objectOfRowId($this->refClass, $key))) {
- yield $this->property => $obj;
- } else foreach ($map->getGateway()->by($row, $this->refName) as $row) {
- yield $this->property => $this->mapper->objectOf($this->refClass, $row);
- }
- }
-
- function write2($object) {
- #echo __METHOD__." ".$this;
- $map = $this->getRefMap();
- $rel = $this->container->getGateway()->getRelation(
- $map->getGateway()->getName(), $this->refName);
- $ref = $this->extract($object);
- foreach ($rel as $fgn => $col) {
- $fld = $map->getFieldMapping($col);
- yield $fgn => $fld->extract($ref);
- }
- }
}
\ No newline at end of file