LoginSignup
2
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-24

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

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3