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; }
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; }