2

Doctrine DBAL プロジェクトを使用して、下の表の列の長さを取得しています (この場合、整数の長さは 8 です)。私は ORM を使用しておらず、YML などでスキーマを定義していません。

CREATE TABLE IF NOT EXISTS `mytable` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

答えを探しているときに、パラメーターのタイプによっては、いくつかの有用な情報を提供するプロパティがいくつかあるように見えることに気付きました。長さ、精度、スケール。次のコードは、いくつかの列プロパティをリストしていますが、私が探している 8 の長さではありません。この一般的な列のプロパティを見つけるのが非常に難しいことは、私にとって非常に驚くべきことです。

$sm = $connection->getSchemaManager(); // $connection is assumed to exist (for e.g. via $this->container->get('database_connection') in Symfony)
foreach ($sm->listTableColumns('mytable') as $column) {
    print_r($column->toArray());
}

Output:
Array
(
    [name] => id
    [type] => Doctrine\DBAL\Types\IntegerType Object
        (
        )

    [default] => 
    [notnull] => 1
    [length] => 
    [precision] => 10
    [scale] => 0
    [fixed] => 
    [unsigned] => 
    [autoincrement] => 1
    [columnDefinition] => 
    [comment] => 
)
4

1 に答える 1

2

Doctrine DBALを掘り下げた後、ライブラリを使用してこれが不可能であることがわかりました。スキーマ マネージャは、取得後にこの情報を単に破棄します。残念ながら、スキーマ マネージャー クラス内の必要な関数にアクセスして汎用機能を提供する方法はありません。これらの関数は保護されており、もちろんライブラリを変更したくないからです。MySQL 用に次の SQL を実行することになりました (これはおそらくプラットフォーム間で移植可能ではありませんが、今のところ問題ありません)。

SELECT COLUMN_NAME AS Field, COLUMN_TYPE AS Type FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'mydatabase' AND TABLE_NAME = 'mytable';
于 2013-05-17T08:34:54.247 に答える