PHP
ORM
Idiorm
paris

軽量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する方法を調べてみた、という闘いの記録でした……。