it-swarm.com.ru

laravel 4 -> получить имена столбцов

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

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

Спасибо.

23
Centurion

Новый ответ

В то время, когда я давал этот ответ у 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() );
47
Antonio Carlos Ribeiro

Вы можете попробовать 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)
18
The Alpha

Вы можете покопаться в экземпляре Доктрины БД.

$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 больше не (по состоянию на L4.1) устанавливается по умолчанию (это «рекомендуемый», а не «обязательный» пакет), но может быть добавлен к вашему composer.json как doctrine/dbal для сохранения этой функциональности.

14
ceejayoz

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

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

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

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

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

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

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

Это также может представлять интерес:

http://laravelsnippets.com/snippets/get-all-columns-names-from-a-eloquent-model-2

0
Mike Rockétt