CakePHP3 には ConnectionManager というクラスがあって、これを使うと、設定ファイルを読み込んで、データベースコネクションを作ってくれる。そこで、スキーマ情報も提供してくれる。
これを利用すると、テーブルの一覧(カラムや型、インデックスなど含む)が取得できる。
<?php
namespace App\Shell;
use App\Shell\AppShell;
use Cake\Console\ConsoleOptionParser;
use Cake\Datasource\ConnectionManager;
use Cake\Log\Log;
use Cake\ORM\TableRegistry;
use Cake\Utility\Inflector;
class ListupAllTablesShell extends AppShell
{
/**
* @return ConsoleOptionParser
*/
public function getOptionParser()
{
$parser = parent::getOptionParser();
$parser->setDescription('設定にかかれたConnectionを利用して、テーブル一覧情報をログに出力します。');
$parser->addOptions([
'use_connection' => ['help' => '利用するConnection', 'default' => 'default'],
'column_detail' => ['help' => 'カラム情報の詳細を取得する', 'boolean' => true],
'index_detail' => ['help' => 'インデックス情報の詳細を取得する', 'boolean' => true],
]);
return $parser;
}
/**
* @return void
*/
public function main()
{
$tableNames = ConnectionManager::get($this->params['use_connection'])->schemaCollection()->listTables();
foreach ($tableNames as $tableName) {
$cameledTableName = Inflector::camelize($tableName);
$table = TableRegistry::get($cameledTableName);
$schema = $table->getSchema();
$columns = [];
$columnNames = $schema->columns();
foreach ($columnNames as $columnName) {
if ($this->params['column_detail']) {
$columns[$columnName] = $schema->getColumn($columnName);
} else {
$columns[] = $columnName;
}
}
$indexes = [];
$indexNames = $schema->indexes();
foreach ($indexNames as $indexName) {
if ($this->params['index_detail']) {
$indexes[$indexName] = $schema->getIndex($indexName);
} else {
$indexes[] = $indexName;
}
}
Log::info('info', json_encode([
'table' => $tableName,
'column' => $columns,
'primary' => $schema->primaryKey(),
'index' => $indexes,
]));
}
}
}
これの何が便利かというと、コマンド一発ですべての情報が出せるところにある。 マイグレーションファイルやFooTable.phpが増えてきたときにはたしてどのテーブルにどういうカラムやインデックスがあるのかわからなくなるので、時折こういうので情報を集めたい。
ほんとうはテスト書いたりCakePHPプラグインとして整理したりしてpackagistに出したかったけれどちょっと面倒になってしまったので一旦ここに記録。