運営者情報

運営してるひと: @sters9

       

妻と猫と横浜あたりに住んでいる。最近は Go や Kubernetes や GCP をしています。 PHP や JavaScript もすこし。

プライバシーポリシー

tools.gomiba.co

サイト内検索

アーカイブ

2022/01 (4)

2021/12 (11) 2021/11 (1) 2021/10 (4) 2021/09 (2) 2021/08 (1) 2021/07 (2) 2021/06 (5) 2021/05 (10) 2021/04 (1) 2021/03 (8) 2021/02 (12) 2021/01 (8)

2020/05 (2) 2020/04 (2) 2020/02 (2) 2020/01 (1)

2019/12 (3) 2019/11 (2) 2019/10 (5) 2019/09 (3) 2019/07 (6) 2019/06 (4) 2019/04 (3) 2019/01 (2)

2018/12 (6) 2018/10 (4) 2018/09 (6) 2018/08 (7) 2018/07 (16) 2018/06 (7) 2018/05 (7) 2018/04 (5) 2018/03 (3) 2018/02 (10) 2018/01 (6)

2017/12 (8) 2017/11 (6) 2017/10 (10) 2017/09 (12) 2017/08 (12) 2017/07 (3) 2017/06 (1) 2017/01 (4)

2016/12 (5) 2016/10 (3) 2016/09 (1) 2016/07 (2) 2016/06 (1) 2016/04 (1) 2016/02 (1) 2016/01 (2)

2015/12 (1) 2015/10 (1) 2015/09 (3) 2015/06 (1) 2015/01 (1)

2014/08 (2) 2014/07 (3) 2014/05 (1) 2014/01 (7)

2013/12 (2) 2013/11 (4) 2013/10 (1) 2013/09 (1) 2013/08 (3) 2013/07 (4) 2013/06 (5) 2013/05 (2) 2013/04 (7) 2013/03 (1)

CakePHP3で利用しているテーブル情報をリストアップする

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に出したかったけれどちょっと面倒になってしまったので一旦ここに記録。