如何检查表名在Propel中是否有效?

时间:2014-01-10 19:33:21

标签: php mysql propel

我想检查一个表名在Propel中是否有效,然后用它做一些事情,比如获取它的PHP名称。问题是我使用的是DatabaseMap,它只包含已经实例化的表。例如:

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

如果我遍历表:

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

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

是否有其他方法可以检查表名在Propel中是否有效?

2 个答案:

答案 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!
}