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

问题描述 投票:0回答:3

我需要获取所有数据库表字段名称。我已经尝试使用

ClassMetadata
不幸的是
getColumnNames()
不返回关系字段名称。并且方法
getAssociationNames()
返回实体属性的名称,这些名称不是相同的名称,并且在使用
oneToMany
关系时还可能包含数据库中并不真正存在的字段。

正如人们提到的,这可能是重复的。它不是。 在doctrine2实体中获取列名称这可能是一个类似的问题,但是

getFieldNames
方法不返回与其他实体有关系的字段名称。

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

php symfony doctrine-orm
3个回答
15
投票

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

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

4
投票

在 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


0
投票
"SELECT * FROM $tableName"

,然后对第一个结果行使用了

array_keys
函数。如果我需要获取代表该列的实体字段名称,您可以使用:

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

它不将参数作为数组,所以我必须使用此函数来查找所有数据库列名称,但使用此

© www.soinside.com 2019 - 2024. All rights reserved.