如何在 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-&gt;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 中获取数据库字段类型?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel如何通过数据透视表获取相关字段列表

Laravel Nova 自定义字段获取模型值

如何在 laravel 中获取 PostgreSQL 的 JSON 类型数据?

如何在 Laravel 中获取非键列字段的不同值?

在 laravel 中使用 vue.js 获取动态字段数据

如何在 laravel 中获取用户的类型?