如何在 Laravel 中获取数据库字段类型?
Posted
技术标签:
【中文标题】如何在 Laravel 中获取数据库字段类型?【英文标题】:How to get database field type in Laravel? 【发布时间】:2013-09-04 22:34:56 【问题描述】:有没有办法获取数据库表字段的数据类型? 这几乎就像迁移的逆过程。
例如,如果用户表列的迁移看起来像
...
$table->integer('age')
...
如果我指定表user
和列age
,是否有返回integer
的函数?
我对特定的数据库实现不感兴趣 (mysql_field_type()
)。就像 Laravel 的迁移一样,它需要与数据库无关。
【问题讨论】:
很遗憾,无法使用 Schema builder。 嘿鲁本斯,请参阅下面的答案。不过谢谢:) 不错!我只是限制自己使用 Schema 构建器,但事实上,Doctrine 可以提供很多信息。 【参考方案1】:对于 Laravel 4:
在 Laravel 中挖掘之后,得到了这个。
DB::connection()->getDoctrineColumn('users', 'age')->getType()->getName()
【讨论】:
哎呀,你完全打败了我:D 哇,你们两个也打败了我。 @abkrim 你需要运行composer require doctrine/dbal
来安装依赖。
@HaoLuo 链接不要你说话。教义问题是因为不支持枚举类型。
这个不支持jsonb。当我的表上有一个 jsonb 属性时,还有其他选择吗?【参考方案2】:
对于 Laravel 5.2 - 8.x
使用Illuminate\Database\Schema\Builder::getColumnType()
DB::getSchemaBuilder()->getColumnType($tableName, $colName)
例如
$ageType = DB::getSchemaBuilder()->getColumnType('user', 'age')
如果您还没有运行此命令,您可能需要运行:
composer require doctrine/dbal
【讨论】:
以下是有效的:将作曲家更新为"doctrine/dbal": "~2.6"
后$column_type = DB::getSchemaBuilder()->getColumnType($model->getTable(), $column_name);
谢谢 - 我更新了我的答案;我的团队使用Illuminate\Support\Facades\Schema::connection()
指定需要哪个连接,并返回\Illuminate\Database\Schema\Builder
实例...感谢您帮助我概括这一点。
是的,你让我开始了正确的答案。我转而投赞成票。谢谢。
作曲家需要学说/dbal【参考方案3】:
简短回答:是的,该功能存在
搜索代码后,我发现你可以。跳至“解决方案”查看。
Eloquent 和 Database 类使用 PDO,它不会将您绑定到特定的基于 SQL 的数据库。
因此,您应该能够执行以下操作:
$pdo = DB::getPdo();
注意连接对象可以return the instance of PDO。
有一些方法,例如getColumnMeta,但并非所有驱动程序都完全支持它们。
然而,一些谷歌搜索似乎指出,最好的方法可能是使用 ANSI-standard INFORMATION_SCHEMA - 使用 sql 查询来获取该信息。
解决方案
最后,Laravel 包含 Doctrine 库作为依赖项,其中确实包含一些 schema functionality。
旁注:事实上,包含 Doctrine 是因为它的基于模式的功能 - Laravel 不使用 Doctrine 的 ORM
在我们检索 PDO 实例的同一个连接对象上查看here,我们可以得到学说连接和模式管理器。您应该可以致电:
$schema = DB:: getDoctrineSchemaManager();
然后,您可以使用架构管理器 (docs here) 来获取您想要的内容。
【讨论】:
【参考方案4】:获取表字段的所有详细信息
DB::select('describe table_name');
示例:-
DB::select('describe users');
回复会是这样的
Array
(
[0] => stdClass Object
(
[Field] => id
[Type] => int(11)
[Null] => NO
[Key] => PRI
[Default] =>
[Extra] => auto_increment
)
[1] => stdClass Object
(
[Field] => user_group_id
[Type] => int(11) unsigned
[Null] => YES
[Key] => MUL
[Default] =>
[Extra] =>
)
[2] => stdClass Object
(
[Field] => username
[Type] => varchar(100)
[Null] => YES
[Key] => MUL
[Default] =>
[Extra] =>
)
)
【讨论】:
【参考方案5】:在Laravel 5+(包括6和7)中,可以通过以下方式获取db表列元数据(即类型、默认值等):
use Illuminate\Support\Facades\Schema;
对于所有列:
$columns = Schema::getConnection()->getDoctrineSchemaManager()->listTableColumns('table_name');
$column = Schema::getConnection()->getDoctrineColumn('table_name'', 'column_name'); //For a single column:
getDoctrineSchemaManager
方法返回一个由\Doctrine\DBAL\Schema\Column
类实例组成的数组。
getDoctrineColumn
方法返回\Doctrine\DBAL\Schema\Column
类的实例。
来自\Doctrine\DBAL\Schema\Column
类的几个方法:
$column->getName();
$column->getNotnull(); // returns true/false
$column->getDefault();
$column->getType();
$column->getLength();
【讨论】:
【参考方案6】:我在 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');
【讨论】:
【参考方案7】:将此表达式与下拉函数一起使用,可以向您显示所有表格字段的数组详细信息:
dd(DB::select(DB::raw('SHOW FIELDS FROM tablename')));
【讨论】:
最简单最有效的解决方案。【参考方案8】:模型内:laravel5.x
$temp = $this->newQuery()->fromQuery("SHOW FIELDS FROM ".$this->getTable()); foreach($temp as $val) echo '字段:'.$val->Field; echo '类型:'.$val->Type;【讨论】:
我正在寻找雄辩的方法,谢谢亲爱的【参考方案9】:概括:
DB::connection()->getDoctrineColumn($tableName, $colName)
->getType()
->getName();
它适用于 Laravel 5.3。
【讨论】:
以上是关于如何在 Laravel 中获取数据库字段类型?的主要内容,如果未能解决你的问题,请参考以下文章