support fkeys with more than one column
[m6w6/pq-gateway] / lib / pq / Gateway / Table / Reference.php
index 6f8e29c29caf5d116d2622a08c0b26d99d4fd70f..d91d9c7c0d31078436bf42b87ad771daf6c85730 100644 (file)
@@ -5,7 +5,7 @@ namespace pq\Gateway\Table;
 /**
  * Foreign key
  */
-class Reference
+class Reference implements \IteratorAggregate
 {
        /**
         * @var string
@@ -18,9 +18,9 @@ class Reference
        public $foreignTable;
        
        /**
-        * @var string
+        * @var array
         */
-       public $foreignColumn;
+       public $foreignColumns;
        
        /**
         * @var string
@@ -28,19 +28,19 @@ class Reference
        public $referencedTable;
        
        /**
-        * @var string
+        * @var array
         */
-       public $referencedColumn;
+       public $referencedColumns;
        
        /**
-        * @param array $state
+        * @param array $ref
         */
-       function __construct($state) {
-               $this->name = $state["name"];
-               $this->foreignColumn = $state["foreignColumn"];
-               $this->foreignTable = $state["foreignTable"];
-               $this->referencedColumn = $state["referencedColumn"];
-               $this->referencedTable = $state["referencedTable"];
+       function __construct($ref) {
+               $this->name = self::name($ref);
+               $this->foreignTable = $ref["foreignTable"];
+               $this->foreignColumns = $ref["foreignColumns"];
+               $this->referencedTable = $ref["referencedTable"];
+               $this->referencedColumns = $ref["referencedColumns"];
        }
        
        /**
@@ -50,4 +50,24 @@ class Reference
        static function __set_state($state) {
                return new static($state);
        }
+       
+       /**
+        * Compose an identifying name
+        * @param array $ref
+        * @return string
+        */
+       static function name($ref) {
+               return implode("_", array_map(function($ck, $cr) {
+                       return preg_replace("/_$cr\$/", "", $ck);
+               }, $ref["foreignColumns"], $ref["referencedColumns"]));
+       }
+       
+       /**
+        * Implements IteratorAggregate
+        * @return \ArrayIterator
+        */
+       function getIterator() {
+               return new \ArrayIterator(array_combine(
+                       $this->foreignColumns, $this->referencedColumns));
+       }
 }