web-dev-qa-db-fra.com

laravel 4 -> obtenir les noms de colonne

Comment obtenir les noms de colonne d'une table dans un tableau ou un objet dans Laravel 4, en utilisant Schema, DB ou Eloquent.

Il semble que je ne trouve pas de fonction prête à l’emploi, vous avez peut-être des implémentations personnalisées.

THX.

23
Centurion

Nouvelle réponse

À l'époque, j'ai donné cette réponse Laravel n'avait pas le moyen de le faire directement , mais maintenant vous pouvez simplement:

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

Réponse ancienne

L'utilisation d'attributs ne fonctionnera pas, car si vous le faites

$model = new ModelName;

Vous n'avez aucun attribut défini pour ce modèle et vous n'obtenez rien.

Ensuite, il n'y a toujours pas de véritable option pour cela, alors je devais descendre au niveau de la base de données et voici mon modèle de base:

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

}

Utilisez-le en faisant:

$model = User::find(1);

dd( $model->getAllColumnsNames() );
47

Vous pouvez essayer Schema::getColumnListing('tablename'):

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

Le résultat serait quelque chose comme ceci en fonction de votre table:

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

Vous pouvez creuser dans l'instance Doctrine de DB.

$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 n'est plus (à partir de L4.1) installé par défaut (c'est un paquetage "suggéré" plutôt que "requis"), mais peut être ajouté à votre composer.json en tant que doctrine/dbal pour conserver cette fonctionnalité.

14
ceejayoz

Je pense qu'il y a deux options différentes, si vous utilisez un modèle Eloquent, vous pouvez regarder la méthode getAccessibleAttributes() qui, en théorie, vous donnerait toutes les colonnes d'un modèle.

Par exemple, vous pourriez faire quelque chose comme ceci pour votre table d'utilisateurs sur un modèle User Eloquent.

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

La méthode attributesToArray() est une autre méthode Eloquent similaire, mais n’exige pas l’obligation d’accessibilité. Le tableau retourné qui devrait avoir vos colonnes comme clé. Vous pouvez ensuite utiliser la fonction PHP array_keys() pour créer un tableau des clés, qui constitueraient vos colonnes.

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

Je sais que ce n'est peut-être pas la solution pour tout le monde, mais vous pouvez peut-être saisir un enregistrement et obtenir toutes les clés des données. Ex.

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