Ответ 1
После рытья в Ларавеле, это то, что я получил.
DB::connection()->getDoctrineColumn('users', 'age')->getType()->getName()
Есть ли способ получить тип данных в поле таблицы базы данных? Почти как инверсия миграции.
Например, если перемещение столбца таблицы пользователей выглядит как
...
$table->integer('age')
...
Есть ли функция, которая вернет integer
, если я укажу таблицу user
и столбец age
?
Меня не интересует конкретная реализация базы данных (mysql_field_type()
). Подобно миграции Laravel, она должна быть агностикой базы данных.
После рытья в Ларавеле, это то, что я получил.
DB::connection()->getDoctrineColumn('users', 'age')->getType()->getName()
После очистки кода я обнаружил, что вы могли. Пропустите ниже "Решение" , чтобы увидеть его.
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), чтобы получить то, что вам нужно.
Я использую это с 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');
Для Laravel 5.2 - 5.5+ используйте Builder:: getColumnType()
DB::getSchemaBuilder()->getColumnType($tableName, $colName)
Обобщая:
DB::connection()->getDoctrineColumn($tableName, $colName)
->getType()
->getName();
Он работает на Laravel 5.3.