27

有没有办法获取数据库表字段的数据类型?这几乎就像迁移的逆过程。

例如,如果用户表列的迁移看起来像

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

integer如果我指定 tableuser和 column是否有返回的函数age

我对特定的数据库实现不感兴趣,(mysql_field_type())。就像 Laravel 的迁移一样,它需要与数据库无关。

4

9 回答 9

34

对于 Laravel 4:

在 Laravel 中挖掘之后,这就是我得到的。

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

于 2013-09-01T21:19:44.193 回答
19

对于 Laravel 5.2 - 9.x

利用Illuminate\Database\Schema\Builder::getColumnType()

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

例如

$ageType = DB::getSchemaBuilder()->getColumnType('user', 'age')

如果您尚未运行此命令,则可能需要:

composer require doctrine/dbal
于 2017-10-04T21:51:11.797 回答
9

简短回答:是的,该功能存在

搜索代码后,我发现你可以。跳到下面的“解决方案”查看它。

Eloquent 和 Database 类使用 PDO,它不会将您绑定到特定的基于 SQL 的数据库。

因此,您应该能够执行以下操作:

$pdo = DB::getPdo();

请注意,连接对象可以返回 PDO 的实例

有一些方法,如getColumnMeta但并非所有驱动程序都完全支持它们

但是,一些谷歌搜索似乎指出,最好的方法可能是使用ANSI 标准的 INFORMATION_SCHEMA - 使用 sql 查询来获取该信息。

解决方案

最后,Laravel 包含 Doctrine 库作为依赖项,它确实包含一些模式功能

旁注:事实上,包含 Doctrine 是因为它的基于模式的功能 - Laravel 不使用 Doctrine 的 ORM

在我们检索 PDO 实例的同一个连接对象上参见此处,我们可以获取学说连接和模式管理器。您应该可以致电:

$schema = DB:: getDoctrineSchemaManager();

然后,您可以使用模式管理器(此处的文档)来获取您想要的内容。

于 2013-09-01T21:31:38.563 回答
8

获取表字段的所有详细信息

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] => 
        )
 )
于 2020-01-10T05:40:02.453 回答
8

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();
于 2020-07-03T05:26:00.483 回答
4

我将它与 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');

于 2013-12-28T16:10:02.817 回答
4

将此表达式与下拉函数一起使用,可以向您显示所有表字段的数组详细信息:

dd(DB::select(DB::raw('SHOW FIELDS FROM tablename')));
于 2018-09-12T13:49:15.270 回答
1

模型内:laravel5.x

    $temp = $this->newQuery()->fromQuery("SHOW FIELDS FROM ".$this->getTable());

    foreach($temp as $val){
       echo '字段:'.$val->Field;
       echo '类型:'.$val->Type;
   }
于 2018-03-21T12:46:33.640 回答
0

概括:

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

它适用于 Laravel 5.3。

于 2017-08-21T06:42:35.980 回答