我想检查一个表名在Propel中是否有效,然后用它做一些事情,比如获取它的PHP名称。问题是我使用的是DatabaseMap,它只包含已经实例化的表。例如:
$map = Propel::getDatabaseMap();
$map->getTableName('group'); // throws exception
如果我遍历表:
$tables = $map->getTables();
foreach ($tables as $key => $value) {
echo $key;
}
它只输出'用户'。它不会在我的数据库中输出任何其他表。
是否有其他方法可以检查表名在Propel中是否有效?
答案 0 :(得分: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]);
在这种情况下,没有必要过滤用户的输入。
答案 1 :(得分:1)
您可以检查该类是否存在:
if (class_exists(camel_case($table, true) . 'Query')) {
// it exists!
}