Как получить тип поля базы данных в Laravel?

Есть ли способ получить тип данных в поле таблицы базы данных? Почти как инверсия миграции.

Например, если перемещение столбца таблицы пользователей выглядит как

...
$table->integer('age')
...

Есть ли функция, которая вернет integer, если я укажу таблицу user и столбец age?

Меня не интересует конкретная реализация базы данных (mysql_field_type()). Подобно миграции Laravel, она должна быть агностикой базы данных.

Ответ 1

После рытья в Ларавеле, это то, что я получил.

DB::connection()->getDoctrineColumn('users', 'age')->getType()->getName()

Ответ 2

Краткий ответ: Да, эта функциональность существует

После очистки кода я обнаружил, что вы могли. Пропустите ниже "Решение" , чтобы увидеть его.

Eloquent и классы базы данных используют PDO, который не привязывает вас к конкретной базе данных на базе SQL.

Следовательно, вы должны сделать что-то вроде этого:

$pdo = DB::getPdo();

Обратите внимание, что объект соединения возвращает экземпляр PDO.

Есть несколько методов, таких как getColumnMeta, , но они не полностью поддерживаются всеми драйверами.

Однако, некоторые поисковые запросы, похоже, указывают на то, что лучшим способом может быть использование ANSI-standard INFORMATION_SCHEMA - используя sql-запросы для получения этой информации.

Решение

Наконец,, Laravel включает библиотеку Doctrine в качестве зависимости, которая содержит некоторую функциональность схемы.

Sidenote: Doctrine, по сути, включена для своих функциональных возможностей на основе схемы. Laravel не использует Doctrine ORM

См. здесь в том же объекте подключения, где мы извлекли экземпляр PDO, мы можем получить соединение с доской и диспетчер схем. Вы должны иметь возможность звонить:

$schema = DB:: getDoctrineSchemaManager();

Затем вы можете использовать диспетчер схем (docs here), чтобы получить то, что вам нужно.

Ответ 3

Я использую это с laravel 4.1,

$schema = \DB::getDoctrineSchemaManager();
$tables = $schema->listTables();

foreach ($tables as $table) {
    echo "<i>".$table->getName() . " </i><b>columns:</b><br>";
    foreach ($table->getColumns() as $column) {
        echo ' - ' . $column->getName() . " - " . $column->getType()->getName() . "<br>";
    }
}

или для получения конкретной таблицы используйте это: $columns = $schema->listTableColumns('user');

Ответ 4

Для Laravel 5.2 - 5.5+ используйте Builder:: getColumnType()

DB::getSchemaBuilder()->getColumnType($tableName, $colName)

Ответ 5

Обобщая:

DB::connection()->getDoctrineColumn($tableName, $colName)
    ->getType()
    ->getName();

Он работает на Laravel 5.3.