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