Подтвердить что ты не робот

Laravel 4 → получить имена столбцов

Как получить имена столбцов таблицы в массиве или объекте в Laravel 4, используя Schema, DB или Eloquent.

Кажется, что я не могу найти готовую к использованию функцию, возможно, у вас есть некоторые пользовательские реализации.

спасибо.

4b9b3361

Ответ 1

Новый ответ

В то время, когда я дал этот ответ , у Laravel не было возможности сделать это напрямую, но теперь вы можете просто:

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

Старый ответ

Использование атрибутов не будет работать, потому что если вы делаете

$model = new ModelName;

У вас нет атрибутов, установленных для этой модели, и вы ничего не получите.

Тогда для этого еще нет реальной возможности, поэтому мне пришлось спуститься на уровень базы данных, и это моя базовая модель:

<?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() );

Ответ 2

Вы можете попробовать Schema::getColumnListing('tablename'):

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

Результат будет примерно таким, как в зависимости от вашей таблицы:

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)

Ответ 3

Вы можете выкопать экземпляр 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();
}

edit: Доктрина больше не установлена ​​(по состоянию на L4.1), установленной по умолчанию (это "предлагаемый", а не "обязательный" пакет), но может быть добавлен в ваш composer.json как doctrine/dbal, чтобы сохранить эту функциональность.

Ответ 4

Я думаю, что есть несколько разных вариантов, если вы используете модель Eloquent, вы можете посмотреть метод getAccessibleAttributes(), который в теория дала бы вам все столбцы модели, которые рассматривают Eloquent как их свойства.

Например, вы могли бы сделать что-то подобное для своей таблицы пользователей в модели User Eloquent.

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

Еще один необычный способ взглянуть на подобный, но не имеет требования "доступности" - это метод attributesToArray(). Возвращаемый массив из которых должен содержать ваши столбцы в качестве ключа. Затем вы можете использовать функцию PHP array_keys() для создания массива ключей, которые будут вашими столбцами.

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

Ответ 5

Я знаю, что это может быть не ответ для всех, но, может быть, вы можете захватить одну запись и получить все ключи от данных. Пример.

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

Ответ 7

Вы также можете попробовать следующее:

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

Ответ 8

Я использую SQL Server и способ Schema для меня:

$columns = array_keys(Schema::getConnection()
->getDoctrineSchemaManager()
->listTableColumns($yourModel->getTable()) );