getConnection(); $xact = (new Connection(PQ_TEST_DSN))->startTransaction(); $exec->setConnection($xact->connection); $exec->execute(new Writer($sql, $params)); $exec->setConnection($conn); return $xact; } class QueryLogger implements SplObserver { protected $fp; function __construct($logfile = null) { if (!isset($logfile)) { $logfile = __DIR__."/query.log"; } if (!$this->fp = @fopen($logfile, "a")) { throw new RuntimeException(error_get_last()["message"]); } } function __destruct() { if (is_resource($this->fp)) { fclose($this->fp); } } function update(SplSubject $executor) { $result = $executor->getResult(); if (isset($result)) { fprintf($this->fp, "[%s] R %s\n", date_create()->format("Y-m-d H:i:s"), json_encode($result)); } elseif (($query = $executor->getQuery())) { $executor->getConnection()->exec("SELECT pg_backend_pid()")->fetchCol($pid); fprintf($this->fp, "[%s] Q %s %% %s @%d\n", date_create()->format("Y-m-d H:i:s"), preg_replace("/\s+/", " ", $query), json_encode($query->getParams()), $pid); } } } class TestModel implements JsonSerializable { private $id, $created, $counter, $number, $data, $list, $prop; private $ref1, $ref2; function jsonSerialize() { return get_object_vars($this); } function __get($p) { return $this->$p; } function __set($p, $v) { $this->$p = $v; } /** * @param Mapper $mapper * @return MapInterface */ static function mapAs(Mapper $mapper) { return new Map( __CLASS__, new Table("test"), $mapper->mapField("id"), $mapper->mapField("created"), $mapper->mapField("counter"), $mapper->mapField("number"), $mapper->mapField("data"), $mapper->mapField("list"), $mapper->mapField("prop"), $mapper->mapAll("ref1")->to(RefTestModel::class)->by("test"), $mapper->mapAll("ref2")->to(RefTestModel::class)->by("another_test") ); } } class RefTestModel { private $pk1, $pk2; private $one, $two; function __get($p) { return $this->$p; } function __set($p, $v) { $this->$p = $v; } static function mapAs($mapper) { return new Map( __CLASS__, new Table("reftest"), $mapper->mapField("pk1", "test_id"), $mapper->mapField("pk2", "another_test_id"), $mapper->mapRef("one")->to(TestModel::class)->by("test"), $mapper->mapRef("two")->to(TestModel::class)->by("another_test") ); } }