【问题标题】:How to select all column name from a table in laravel?如何从 laravel 中的表中选择所有列名?
【发布时间】:2016-05-11 08:40:20
【问题描述】:

我试图从表中获取所有列名Teller

功能:

public function getTableColumns($tables)
{
    return DB::select(DB::raw('SELECT 
                                    COLUMN_NAME, 
                                    DATA_TYPE, 
                                    COLUMN_DEFAULT
                                FROM 
                                    INFORMATION_SCHEMA.COLUMNS
                                WHERE 
                                    table_name = `Teller`'));
}

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    您可以通过简单的操作来获取所有列的名称...

    use Illuminate\Support\Facades\Schema;
    
    use Illuminate\Support\Facades\DB;
    
    public function getTableColumns($table)
    {
        return DB::getSchemaBuilder()->getColumnListing($table);
    
        // OR
    
        return Schema::getColumnListing($table);
    
    }
    

    【讨论】:

    • 连接时的问题是你需要在列名前加上表名,如:$tableName =...; $columns = Schema::getColumnListing($tableName); $columns = array_map(function ($elem) use ($tableName) {return $tableName . '.' . $elem;}, $columns);
    • 太棒了!它正在工作
    【解决方案2】:

    从模型中获取表名

    $product = new Product;
    $table = $product->getTable();
    print_r($table);
    

    从模型中获取表列名称

    <?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Product extends Model
    {   
        public function getTableColumns() {
            return $this->getConnection()->getSchemaBuilder()->getColumnListing($this->getTable());
        }
    }
    

    现在您将获得“产品”表的所有列,如果您在控制器中需要它,那么您可以通过以下方式获得它:

     $product = new Product;
     $columns = $product->getTableColumns();
     print_r($columns);
    

    【讨论】:

      【解决方案3】:

      如果您有多个数据库连接,请尝试以下操作:

      在您的 php 脚本顶部添加

      use Illuminate\Support\Facades\Schema;
      

      检索代码中的任何位置

      有数据库连接

      $columns = Schema::Connection('business')->getColumnListing('users'); // 'business' is your database connection
      
              echo "<pre>";
              print_r($columns);
              exit();
      

      没有数据库连接

      $columns = Schema::getColumnListing('users');
      
          echo "<pre>";
          print_r($columns);
          exit();
      

      【讨论】:

        【解决方案4】:

        从 Laravel 6.x 开始,这有效:

                            $db = DB::connection()->getPdo();
                            $rs = $db->query('SELECT * FROM Teller LIMIT 0');
                            for ($i = 0; $i < $rs->columnCount(); $i++) {
                                    $col = $rs->getColumnMeta($i);
                                    $columns[] = $col['name'];
                            }
                            print_r($columns);
        

        这里的提示只是绕过 eloquent(它应该只是提供一种简单的方法来做到这一点,但显然没有)并获取 PDO 对象然后use the answer from the same question for straight PDO access

        这也适用于通过用 databasename.Teller 替换 'Teller' 来选择没有数据库的情况

        HTH,

        -英尺

        【讨论】:

          【解决方案5】:

          您只需要从查询响应中提取键

          array_keys(json_decode(json_encode($table[0]), true))
          

          【讨论】:

            【解决方案6】:

            使用集合的模型的另一种方式。

            collect(User::first())->keys();
            

            【讨论】:

              【解决方案7】:

              @Eduardo Wallace 方法最简单;只需从表中返回第一个值,去掉保留键的值

              $T1 = table_name::first();
              $table_columns = array_keys(json_decode($T1, true));
              

              如果您不需要所有列,请去掉不需要的列,只留下需要的列:

              $needed_columns = array_diff($table_columns, ['unneeded_1', 'unneeded_2']);
              

              你可以争论使用的方法,反正对我来说最简单!

              【讨论】:

                【解决方案8】:
                $db = [];
                $tables =  DB::select('SHOW TABLES');
                
                    foreach ($tables as $key => $table) {
                        $name = $table->Tables_in_app;
                        $app[$name] =  DB::getSchemaBuilder()->getColumnListing($name);
                    }
                
                return $db;
                

                【讨论】:

                  【解决方案9】:

                  你可以通过这个脚本得到一个想法

                      $columns = array();
                      foreach(\DB::select("SHOW COLUMNS FROM $table") as $column)
                      {
                         //print_r($column);
                          $columns[$column->Field] = '';
                      }
                    
                      return $columns;
                  

                  【讨论】:

                    【解决方案10】:

                    你可以简单地写:

                    public function getTableColumns($tables)
                    {
                        return DB::select(
                            DB::raw('SELECT * FROM `Teller`')
                        );
                    }
                    

                    如果您有Teller 模型,您也可以使用Teller::all();

                    更新

                    要获取所有列名,您可以运行 SHOW FIELDS Teller

                    【讨论】:

                    • 获取列名不获取每一列的值
                    • 我更新了我的答案。但是没有 Laravel/Eloquent 要求这样做。
                    【解决方案11】:

                    你可以用这个

                    DB::table('table_name')->get();
                    

                    【讨论】:

                    • 这是为了获取数据。问题是获取列名,即使没有数据也应该工作。
                    猜你喜欢
                    • 2022-09-28
                    • 1970-01-01
                    • 2020-01-22
                    • 2011-11-07
                    • 2019-10-24
                    • 1970-01-01
                    • 2021-07-25
                    • 1970-01-01
                    • 2013-07-25
                    相关资源
                    最近更新 更多