Symfony从数据库表中获取所有字段名称

时间:2015-08-05 08:43:42

标签: symfony doctrine-orm

我需要获取所有数据库表字段名称。我已经尝试使用ClassMetadata使用getColumnNames(),但遗憾的是getAssociationNames()没有返回关系字段名称。和方法oneToMany返回不同名称的实体属性的名称,也可能包含使用getFieldNames关系时在数据库中不存在的字段。

正如人们提到的那样,这可能是重复的。不是。 Getting column names in a doctrine2 entity这可能是一个类似的问题,但SqlCommand方法不会返回与其他实体有关系的字段名称。

那么如何从数据库表中获取所有列名?

3 个答案:

答案 0 :(得分:10)

我用这段代码解决了这个问题:

$class = $this->em->getClassMetadata('Entity');
    $fields = [];
    if (!empty($class->discriminatorColumn)) {
        $fields[] = $class->discriminatorColumn['name'];
    }
    $fields = array_merge($class->getColumnNames(), $fields);
    foreach ($fields as $index => $field) {
        if ($class->isInheritedField($field)) {
            unset($fields[$index]);
        }
    }
    foreach ($class->getAssociationMappings() as $name => $relation) {
        if (!$class->isInheritedAssociation($name)){
            foreach ($relation['joinColumns'] as $joinColumn) {
                $fields[] = $joinColumn['name'];
            }
        }
    }
    return $fields;

答案 1 :(得分:0)

我通过使用原始sql查询解决了这个问题。在我的情况下,因为我需要表格中的所有数据用于数据导出,所以我使用了查询"SELECT * FROM $tableName",然后我使用array_keys函数和第一个结果行。如果我需要获取表示该列的实体字段名称,您可以使用:

$entityManager->getClassMetadata->getFieldForColumn($column);

它不会将参数作为数组,因此我必须使用此函数预先知道所有db列名称,但是使用此

答案 2 :(得分:0)

在Doctrine中,DBAL组件用于处理数据库级任务。它还能够列出数据库表的所有列。 DBAL组件在数据库级别运行,这意味着它查看任何实体元数据。假设您有一个EntityManager实例,则可以获取如下列名:

// $em is your Doctrine\ORM\EntityManager instance
$schemaManager = $em->getConnection()->getSchemaManager();
// array of Doctrine\DBAL\Schema\Column
$columns = $schemaManager->listTableColumns($tableName);

$columnNames = [];
foreach($columns as $column){
    $columnNames[] = $column->getName();
}
// $columnNames contains all column names

模式管理器的文档可以在这里找到: https://www.doctrine-project.org/projects/doctrine-dbal/en/2.9/reference/schema-manager.html#schema-manager