Edited at

軽量ORMの Idiorm でデータベーステーブルのカラム一覧を取得する

More than 1 year has passed since last update.

Idiormにかぎらず、LaravelなどのORMでも使える手法と思います。


ちゃんとSQLする方法

改めて調べてみないとなかなかパッと出てこない、SQLでカラム名を取得する方法。出てくるのがカラム名だけではないので、SELECTしてやることと、出て来る配列がちょっとキモチワルイので、array_column でカラム名だけの配列に直しています。

$result = \Database\Idiorm\ORM::for_table( 'information_schema.columns' )

->select('column_name')
->where('table_name','my_table_name') // ここにテーブル名
->order_by_expr('ordinal_position')
->find_array();

$columns = array_column($result,'column_name');


難しいことを考えない方法

レコードを1つ配列で取得して、そのインデックスを拾えばいいじゃん、というネタ。あまりに巨大なデータが入っているとパフォーマンスが悪くなるかもしれないのと、そもそもレコード数がゼロだと動かないという致命的デメリットがあります。

$record = MyModel::factoryModel()->limit(1)->find_array();

$columns = array_keys($record[0]);

メリットは、テーブル名が必要ないこと、かな。


ベストプラクティス?

でもそれだったら、最初から「ちゃんとSQLする方法」でメソッドを作っておけばいいと、個人的には思います……。

class MyModel extends Model {

public static function getColumns(){
$result = \Database\Idiorm\ORM::for_table( 'information_schema.columns' )
->select('column_name')
->where('table_name', $this->_table )
->order_by_expr('ordinal_position')
->find_array();

return array_column($result,'column_name');
}
}

$columns = MyModel::getColumns();


余談

以上、難しいことを考えない方法でやってるコードを見つけて、ちゃんとSQLする方法を調べてみた、という闘いの記録でした……。