【问题标题】:How to get database field type in Laravel?如何在 Laravel 中获取数据库字段类型?
【发布时间】:2013-09-04 22:34:56
【问题描述】:

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

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

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

如果我指定表user 和列age,是否有返回integer 的函数?

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

【问题讨论】:

  • 很遗憾,无法使用 Schema builder。
  • 嘿鲁本斯,请参阅下面的答案。不过谢谢:)
  • 不错!我只是限制自己使用 Schema 构建器,但事实上,Doctrine 可以提供很多信息。

标签: php database laravel


【解决方案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。

          【讨论】:

            猜你喜欢
            • 2020-12-24
            • 1970-01-01
            • 1970-01-01
            • 2017-02-12
            • 2023-02-23
            • 1970-01-01
            • 2010-11-28
            • 2013-10-16
            • 1970-01-01
            相关资源
            最近更新 更多