wake-up-neo.net

laravel 4 -> Spaltennamen erhalten

So erhalten Sie Spaltennamen einer Tabelle in einem Array oder Objekt in Laravel 4 mit Schema, DB oder Eloquent.

Es scheint, dass ich keine gebrauchsfertige Funktion finden kann. Möglicherweise haben Sie einige benutzerdefinierte Implementierungen.

Vielen Dank.

23
Centurion

Neue Antwort

Zu der Zeit, als ich diese Antwort gab, hatte Laravel keine Möglichkeit, dies direkt zu tun , aber jetzt können Sie einfach:

$columns = Schema::getColumnListing('users');

Alte Antwort

Die Verwendung von Attributen funktioniert nicht, wenn Sie dies tun

$model = new ModelName;

Sie haben keine Attribute für dieses Modell und Sie erhalten nichts.

Dann gibt es noch keine echte Option dafür, also musste ich auf die Datenbankebene gehen und das ist mein 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;
    }

}

Verwenden Sie es dabei:

$model = User::find(1);

dd( $model->getAllColumnsNames() );

Sie können Schema::getColumnListing('tablename') versuchen:

$columns = Schema::getColumnListing('users'); // users table
dd($columns); // dump the result and die

Das Ergebnis wäre in Abhängigkeit von Ihrer Tabelle ungefähr so:

array (size=12)
  0 => string 'id' (length=2)
  1 => string 'role_id' (length=7)
  2 => string 'first_name' (length=10)
  3 => string 'last_name' (length=9)
  4 => string 'email' (length=5)
  5 => string 'username' (length=8)
  6 => string 'password' (length=8)
  7 => string 'remember_token' (length=14)
  8 => string 'bio' (length=3)
  9 => string 'created_at' (length=10)
  10 => string 'updated_at' (length=10)
  11 => string 'deleted_at' (length=10)
18
The Alpha

Sie können in die Doctrine-Instanz von DB einsteigen.

$columns = DB::connection()
  ->getDoctrineSchemaManager()
  ->listTableColumns('table');

foreach($columns as $column) {
  print $column->getName();
  print $column->getType()->getName();
  print $column->getDefault();
  print $column->getLength();
}

edit: Doctrine ist nicht mehr standardmäßig (ab L4.1) installiert (es wird ein 'vorgeschlagenes' anstelle eines 'erforderlichen' Pakets), aber es kann zu Ihrem composer.json als doctrine/dbal hinzugefügt werden, um diese Funktionalität zu erhalten.

14
ceejayoz

Ich denke, es gibt ein paar verschiedene Optionen. Wenn Sie ein Eloquent-Modell verwenden, können Sie sich die getAccessibleAttributes() -Methode anschauen, die theoretisch alle Spalten eines Modells enthält, die Eloquent als Eigenschaften betrachtet.

Zum Beispiel könnten Sie so etwas für Ihre Benutzertabelle in einem User Eloquent-Modell tun.

$user = // Retrieve your User model.
$columns = User->getAccessibleAttributes();

Eine andere eloquente Methode, die ähnlich ist, jedoch nicht die Anforderung an die Zugänglichkeit enthält, ist die attributesToArray() -Methode. Das zurückgegebene Array sollte Ihre Spalten als Schlüssel enthalten. Dann können Sie die Funktion PHP array_keys() verwenden, um ein Array der Schlüssel zu erstellen, die Ihre Spalten sein würden.

$user = // Retrieve your User model.
$columns = array_keys(User::attributesToArray());
1
Sajan Parikh

Ich weiß, es ist möglicherweise nicht die Antwort für alle, aber vielleicht können Sie sich einen Datensatz holen und alle Schlüssel der Daten erhalten. Ex.

array_keys(User::first()->toArray());
1
windmaomao
0
Mike Rockétt