サイト案内

運営してるひと: @sters9

妻と娘と猫と神奈川県に住んでいます。最近は Go, Ruby, Rails, Kubernetes, GCP, Datadog あたりをしていますがもっといろいろやりたい!

サイト案内

開発環境の紹介

プライバシーポリシー

tools.gomiba.co

サイト内検索

アーカイブ

2024/03 (4) 2024/01 (3)

2023/12 (1) 2023/11 (3) 2023/10 (1) 2023/09 (1) 2023/08 (2) 2023/05 (4) 2023/04 (4) 2023/03 (4) 2023/02 (2) 2023/01 (1)

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

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で利用しているテーブル情報をリストアップする

この記事は公開されてから1年以上経過しており、最新の内容に追従できていない可能性があります。

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