スキーマ、DB、またはEloquentを使用して、Laravel 4の配列またはオブジェクトのテーブルの列名を取得するにはどうすればよいですか?
すぐに使用できる関数が見つからないようです。カスタム実装がある可能性があります。
私がこの回答をした時点で、Laravelにはこれを直接行う方法がありませんでしたが、今では次のことができます:
$columns = Schema::getColumnListing('users');
属性の使用は機能しません。
$model = new ModelName;
そのモデルには属性が設定されておらず、何も得られません。
そのための実際のオプションはまだないので、データベース レベルに降りる必要がありました。これが私の BaseModel です。
<?php
class BaseModel extends \Eloquent {
public function getAllColumnsNames()
{
switch (DB::connection()->getConfig('driver')) {
case 'pgsql':
$query = "SELECT column_name FROM information_schema.columns WHERE table_name = '".$this->table."'";
$column_name = 'column_name';
$reverse = true;
break;
case 'mysql':
$query = 'SHOW COLUMNS FROM '.$this->table;
$column_name = 'Field';
$reverse = false;
break;
case 'sqlsrv':
$parts = explode('.', $this->table);
$num = (count($parts) - 1);
$table = $parts[$num];
$query = "SELECT column_name FROM ".DB::connection()->getConfig('database').".INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'".$table."'";
$column_name = 'column_name';
$reverse = false;
break;
default:
$error = 'Database driver not supported: '.DB::connection()->getConfig('driver');
throw new Exception($error);
break;
}
$columns = array();
foreach(DB::select($query) as $column)
{
$columns[] = $column->$column_name;
}
if($reverse)
{
$columns = array_reverse($columns);
}
return $columns;
}
}
次のように使用します。
$model = User::find(1);
dd( $model->getAllColumnsNames() );
DB の Doctrine インスタンスを掘り下げることができます。
$columns = DB::connection()
->getDoctrineSchemaManager()
->listTableColumns('table');
foreach($columns as $column) {
print $column->getName();
print $column->getType()->getName();
print $column->getDefault();
print $column->getLength();
}
編集: Doctrine は (L4.1 の時点で) デフォルトではインストールされなくなりました (「必須」パッケージではなく「推奨」パッケージです) が、この機能を維持するためにcomposer.json
asに追加できます。doctrine/dbal
すべての人にとっての答えではないかもしれませんが、1 つのレコードを取得して、データのすべてのキーを取得できるかもしれません。元。
array_keys(User::first()->toArray());
これを試すこともできます:
abstract class BaseModel extends Eloquent {
public function getColumnsNames()
{
$connection = DB::connection();
$connection->getSchemaBuilder();
$table = $connection->getTablePrefix() . $this->table;
$grammar = $connection->getSchemaGrammar();
$results = $connection->select($grammar->compileColumnExists(), array($connection->getDatabaseName(), $table));
return $connection->getPostProcessor()->processColumnListing($results);
}
}
私はSQL Serverを使用しており、スキーマの方法がうまくいきました:
$columns = array_keys(Schema::getConnection()
->getDoctrineSchemaManager()
->listTableColumns($yourModel->getTable()) );