2014-01-10 23 views
1

我想检查表名在Propel中是否有效,然后对它进行一些操作,例如获取它的PHP名称。问题是我正在使用DatabaseMap,它只包含已经实例化的表。例如:如何检查表名在Propel中是否有效?

$map = Propel::getDatabaseMap(); 
$map->getTableName('group'); // throws exception 

如果我遍历表:

$tables = $map->getTables(); 
foreach ($tables as $key => $value) { 
    echo $key; 
} 

只输出 '用户'。它不会在我的数据库中输出任何其他表。

是否有任何其他方法来检查表名在Propel中是否有效?

+0

我会以某种方式引导在运行时的开始我的数据库的表中列出的? – NobleUplift

回答

1

您可以使用PHP的simplexml来分析您的schema.xml。

$xml = simplexml_load_file('schema.xml'); 
$tableExists = 0 < count($xml->xpath("table[@phpName='$tableName']")); 

不要忘了过滤用户的输入为$tableName,否则有可能注入自己的查询到的XPath。 要获得更好的性能,您应该缓存结果。

如果您根据schema.xml创建包含所有表的哈希映射,则更好的办法是缓存该哈希映射并每次检查该映射。

$hashMap = $foo->getCache('tables'); 

if (!$hashMap) { 
    $xml = simplexml_load_file('schema.xml'); 
    $tables = $xml->xpath("table"); 
    foreach ($tables as $table) { 
     $hashMap[$table['phpName']] = true; 
    } 
    $foo->setCache('tables', $hashMap); 
} 

$tableExists = isset($hashMap[$tableName]); 

在这种情况下,没有必要过滤用户的输入。

+0

我发布了[Propel 1的一个问题](https://github.com/propelorm/Propel/issues/819),如果生成器只是创建表名到PHP名称的映射并将其保存在一个新的文件,但直到或如果这是实施,这是最好的解决方案。 – NobleUplift

1

你可以只检查,看看是否存在类:

if (class_exists(camel_case($table, true) . 'Query')) { 
    // it exists! 
} 
+0

好主意,但你有我的问题倒退。我需要将表名称转换为PHP名称,而不是将PHP名称转换为表名称。 – NobleUplift