コード例 #1
0
ファイル: MySQL.php プロジェクト: wave-framework/wave
 private static function _getRelationCache(DB\Table $table)
 {
     $namespace = $table->getDatabase()->getNamespace();
     if (!isset(self::$_relation_cache[$namespace])) {
         self::$_relation_cache[$namespace] = array();
         //join across these memory views is slow but it's much tidier than any other way.
         $relations_sql = 'SELECT kcu.TABLE_SCHEMA, kcu.TABLE_NAME, kcu.COLUMN_NAME, kcu.REFERENCED_TABLE_SCHEMA, kcu.REFERENCED_TABLE_NAME, kcu.REFERENCED_COLUMN_NAME, tc.CONSTRAINT_NAME, tc.CONSTRAINT_TYPE ' . 'FROM information_schema.TABLE_CONSTRAINTS tc ' . 'INNER JOIN information_schema.KEY_COLUMN_USAGE kcu USING(CONSTRAINT_SCHEMA, CONSTRAINT_NAME, TABLE_NAME) ' . 'WHERE tc.TABLE_SCHEMA = ? OR kcu.REFERENCED_TABLE_SCHEMA = ?;';
         $relations_stmt = $table->getDatabase()->getConnection()->prepare($relations_sql);
         $relations_stmt->execute(array($table->getDatabase()->getName(), $table->getDatabase()->getName()));
         while ($relations_row = $relations_stmt->fetch()) {
             self::$_relation_cache[$namespace][$relations_row['TABLE_NAME']][] = $relations_row;
             //Relations added for both directions, flag the one that's reversed.
             $relations_row['REVERSE'] = true;
             self::$_relation_cache[$namespace][$relations_row['REFERENCED_TABLE_NAME']][] = $relations_row;
         }
     }
     return isset(self::$_relation_cache[$namespace][$table->getName()]) ? self::$_relation_cache[$namespace][$table->getName()] : null;
 }
コード例 #2
0
ファイル: Column.php プロジェクト: wave-framework/wave
 /**
  * @return bool
  */
 public function isPrimaryKey()
 {
     $pk = $this->table->getPrimaryKey();
     return $pk === null ? false : in_array($this, $pk->getColumns());
 }
コード例 #3
0
ファイル: Postgresql.php プロジェクト: wave-framework/wave
 private static function _getRelationCache(DB\Table $table)
 {
     $namespace = $table->getDatabase()->getNamespace();
     if (!isset(self::$_relation_cache[$namespace])) {
         self::$_relation_cache[$namespace] = array();
         //join across these memory views is slow but it's much tidier than any other way.
         $relations_sql = 'SELECT
             DISTINCT (tc.constraint_name, kcu.column_name),
             tc.table_catalog,
             tc.table_schema,
             tc.table_name,
             kcu.column_name,
             CASE WHEN constraint_type = \'FOREIGN KEY\' THEN ccu.table_catalog END AS referenced_table_catalog,
             CASE WHEN constraint_type = \'FOREIGN KEY\' THEN ccu.table_schema END AS referenced_table_schema,
             CASE WHEN constraint_type = \'FOREIGN KEY\' THEN ccu.table_name END AS referenced_table_name,
             CASE WHEN constraint_type = \'FOREIGN KEY\' THEN ccu.column_name END AS referenced_column_name,
             tc.constraint_name,
             constraint_type
         FROM
             information_schema.table_constraints AS tc
             JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
             JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
         WHERE tc.table_schema = :schema OR kcu.table_schema = :schema';
         $relations_stmt = $table->getDatabase()->getConnection()->prepare($relations_sql);
         $relations_stmt->execute(array('schema' => $table->getDatabase()->getSchema()));
         while ($relations_row = $relations_stmt->fetch()) {
             self::$_relation_cache[$namespace][$relations_row['table_name']][] = $relations_row;
             //Relations added for both directions, flag the one that's reversed.
             $relations_row['reverse'] = true;
             self::$_relation_cache[$namespace][$relations_row['referenced_table_name']][] = $relations_row;
         }
     }
     return isset(self::$_relation_cache[$namespace][$table->getName()]) ? self::$_relation_cache[$namespace][$table->getName()] : null;
 }