Wie erhalte ich Datenbankspaltennamen in Laravel?

Lesezeit: 6 Minuten

Benutzer-Avatar
Zenturio

Wie kann ich Spaltennamen einer Tabelle in einem Array oder Objekt in Laravel 4 mit Schema, DB oder Eloquent abrufen?

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

  • Möglicherweise müssen Sie eine Rohabfrage durchführen

    – UltraInstinkt

    13. November 2013 um 11:20 Uhr

  • Beachten Sie, dass sich die folgenden Lösungen ändern können, wenn Laravel 4.1 erreicht, da Doctrine (und damit die Schema-Klassen von Doctrine) als Abhängigkeit entfernt wurden

    – Fideloper

    13. November 2013 um 13:55 Uhr

  • Ich kann nicht glauben, dass Laravel diese Funktion nicht bereits bietet, CodeIgniter hat sie. Wo kann ich eine Anfrage für diese Funktionalität in Laravel einreichen?

    – Grabenfisch

    20. Mai 2014 um 11:01 Uhr

Benutzer-Avatar
Antonio Carlos Ribeiro

Neue Antwort

Damals gab ich diese Antwort Laravel hatte keine Möglichkeit, dies direkt zu tunaber jetzt können Sie einfach:

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

Alte Antwort

Die Verwendung von Attributen wird nicht funktionieren, denn wenn Sie dies tun

$model = new ModelName;

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

Dann gibt es dafür immer noch keine wirkliche Option, also musste ich auf die Datenbankebene runtergehen 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() );

  • Ich habe hier keinen Zugriff auf mysql, also habe ich es mit getestet sqlfiddle.com/#!2/066acd/2. Könnten Sie bitte manuell ‘SHOW COLUMNS FROM ‘ in Ihrem MySQL ausführen?

    – Antonio Carlos Ribeiro

    13. November 2013 um 13:09 Uhr

  • Nur für MySQL behoben.

    – Antonio Carlos Ribeiro

    13. November 2013 um 13:54 Uhr

  • hat jetzt funktioniert, danke, ich akzeptiere es, da es die erste funktionierende Antwort war, aber die Antwort von @ceejayoz funktioniert auch, mit einigen Anpassungen für den Enum-Typ, danke an alle.

    – Zenturio

    13. November 2013 um 14:40 Uhr

  • Als ich diese Antwort gab, hatte Laravel keine Möglichkeit, dies direkt zu tun. Antwort bearbeitet.

    – Antonio Carlos Ribeiro

    26. August 2014 um 13:14 Uhr

  • getColumnListing ist eine geschützte Funktion; Sie können es nicht einfach so verwenden, wie Sie es vorschlagen, Sie müssen es einwickeln.

    – Benuvogel

    16. September 2014 um 15:51 Uhr

Benutzer-Avatar
Das Alpha

Du kannst es versuchen Schema::getColumnListing('tablename'):

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

Das Ergebnis wäre in etwa so, abhängig von Ihrer Tabelle:

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)

  • in einem Namensraum den Schrägstrich am Anfang nicht vergessen \Schema::getColumnListing(‘tablename’)

    – rtconner

    23. Oktober 2014 um 4:15 Uhr


Benutzer-Avatar
ceejayoz

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

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

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

bearbeiten: Doctrine wird (ab L4.1) nicht mehr standardmäßig installiert (es ist eher ein „empfohlenes“ als ein „erforderliches“ Paket), kann aber zu Ihrem hinzugefügt werden composer.json als doctrine/dbal um diese Funktion beizubehalten.

  • Habe das auch versucht, aber es funktioniert nicht für SQL Server: Klasse ‘Doctrine\DBAL\Driver\PDOSqlsrv\Driver’ nicht gefunden.

    – Antonio Carlos Ribeiro

    13. November 2013 um 13:06 Uhr

  • @AntonioCarlosRibeiro Ich habe Microsoft SQL Server noch nie mit Doctrine verwendet, also sind Sie dort auf sich allein gestellt. Eine Rohabfrage ist wahrscheinlich die beste Wahl, wenn dies Ihre zugrunde liegende Technologie ist. Das OP verwendet jedoch MySQL.

    – ceejayoz

    13. November 2013 um 13:08 Uhr

  • Diese Lösung funktioniert, eine Sache zu erwähnen, wenn die Tabelle enum type enthält, wird diese Ausnahme ausgelöst. Unbekannter Datenbanktyp Enum angefordert, Doctrine\DBAL\Platforms\MySqlPlatform unterstützt es möglicherweise nicht.

    – Zenturio

    13. November 2013 um 13:36 Uhr


  • @Centurion Laravel unterstützt Enums technisch überhaupt nicht – Sie können keine über den Schema-Manager erstellen.

    – ceejayoz

    13. November 2013 um 14:42 Uhr

  • @ceejayoz basierend auf Dokumenten, die ich erstellt habe, laravel.com/docs/schema, $table->enum(‘choices’, array(‘foo’, ‘bar’)); ENUM entspricht der Tabelle, die Wahrheit ist, dass Doctrine sie nicht unterstützt.

    – Zenturio

    13. November 2013 um 14:45 Uhr


Benutzer-Avatar
Sajan Parich

Ich denke, es gibt ein paar verschiedene Optionen, wenn Sie ein Eloquent-Modell verwenden, können Sie sich das ansehen getAccessibleAttributes() Methode, die Ihnen theoretisch alle Spalten eines Modells liefern würde. Eloquent scheint sie als Eigenschaften zu betrachten.

Beispielsweise könnten Sie so etwas für Ihre Benutzertabelle auf einem User Eloquent-Modell tun.

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

Eine andere eloquente Methode, die ähnlich ist, aber nicht die Anforderung der „Zugänglichkeit“ hat, ist die attributesToArray() Methode. Das zurückgegebene Array davon sollte Ihre Spalten als Schlüssel haben. Dann können Sie die PHP-Funktion verwenden array_keys() um ein Array der Schlüssel zu erstellen, die Ihre Spalten wären.

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

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

array_keys(User::first()->toArray());

  • Dies funktioniert hervorragend, wenn Sie Teilansichten haben, die von vielen verschiedenen Modellen abhängig sind.

    – Siphon

    16. Juli 2015 um 18:39 Uhr


  • Funktioniert nicht richtig, wenn Sie einige Spalten ausgeblendet oder maskiert haben.

    – Arda

    23. Oktober 2015 um 9:48 Uhr

Benutzer-Avatar
1210mk2

Wenn Sie eine Modellinstanz haben, können Sie wie folgt abrufen:

    $table_name = $model->getTable();
    $connection = $model->getConnection();
    $schemaBulder = $connection->getSchemaBuilder();

    $columns_array = $schemaBulder->getColumnListing($table_name);

Funktioniert für Laravel 5

  • Dies funktioniert hervorragend, wenn Sie Teilansichten haben, die von vielen verschiedenen Modellen abhängig sind.

    – Siphon

    16. Juli 2015 um 18:39 Uhr


  • Funktioniert nicht richtig, wenn Sie einige Spalten ausgeblendet oder maskiert haben.

    – Arda

    23. Oktober 2015 um 9:48 Uhr

Sie können dies auch versuchen:

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);
}
}

  • Das funktioniert bei mir nicht. Der Debugger sagt: $grammar->compileColumnExists($table) = “select column_name from information_schema.columns where table_schema = ? and table_name = ?” Es ersetzt nicht die Werte in der Abfrage, wenn es kompiliert … was übersehe ich?

    – John Corry

    17. Juni 2014 um 17:59 Uhr

  • Können Sie irgendwo ein Beispiel einfügen, wie Sie es verwenden? Die Idee hier ist, dies nur in Ihren Modellklassen zu verwenden. Wobei sie die Tabelleneigenschaft festgelegt haben. Auch dies funktioniert für mich in einer 4.1. * Laravel-App, möglicherweise muss sich dies in neueren Versionen ändern.

    – gvsrepins

    18. Juni 2014 um 19:18 Uhr


  • Ich aktualisiere den Code, indem ich das BaseModel abscract mache, um eine Implementierung zu erzwingen.

    – gvsrepins

    18. Juni 2014 um 19:19 Uhr

1015110cookie-checkWie erhalte ich Datenbankspaltennamen in Laravel?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy