如何在Laravel 5.1中获取数据库中的表列表

54

我需要列出数据库中的表,我找到了这个查询

SHOW TABLES LIKE  'merTrans%'

我想获取表格,但如何使用foreach在Laravel 5.1中获取表格名称?

17个回答

70
我一直在使用这个:

$tables = DB::connection()->getDoctrineSchemaManager()->listTableNames();

它需要doctrine/dbal作为依赖项。但是一些迁移功能已经需要DBAL才能正常工作。

7
我更喜欢这个选项,因为我不需要处理不同的数据库语法。 - onetdev
4
非常有效,回答太棒了,这个应该被接受! - Abhay Maurya
1
一个简短而精美的解决方案,可以直接从数据库中获取所有表名。感谢@carlosvini。 - Safi Ahmed
1
谢谢。我必须先执行 composer req doctrine/dbal。(如果尚未安装) - Erlang Parasu

66

要列出数据库中的表,您可以执行以下操作

$tables = DB::select('SHOW TABLES');
foreach($tables as $table)
{
      echo $table->Tables_in_db_name;
}

您需要将db_name更改为您数据库的名称。

编辑:对于类似情况

foreach ($tables as $table) {
    foreach ($table as $key => $value)
        echo $value;
}

没有像条件的话,它可以正常工作。但是如果我添加了 "LIKE 'merTrans%'",就会出现“未定义属性:stdClass::$Tables_in_db_name”。 - Balachandiran
2
双重foreach对于这种情况似乎有些不必要? - killstreet
2
请注意,此答案仅适用于MySQL。根据语法,OP正在使用MySQL,但是在Sqlite3或Postgresql数据库中,这将无法工作。 - haz
$tableNames = collect(DB::select('SHOW TABLES'))->map(function($val) { return head($val); }); 表名 = collect(DB::select('SHOW TABLES'))->map(function($val) { return head($val); }); - Tebe

33

要快速获取包含所有数据库的数组,您可以使用以下代码段:

// Iterate over the results of SHOW TABLES
// strip off all the objects and keys.
$tables = array_map('reset', \DB::select('SHOW TABLES'));

对我来说,这似乎是最优雅的解决方案。


3
喜欢这个.. #L55 - Wahyu Kristianto
3
完美的回答,处理这件事情最优雅的方式。谢谢! - Mukeyii

11

对于Postgres用户:

SHOW TABLES不受支持,因此您需要采取一些更加巧妙的方法。

$tables = DB::select("SELECT table_schema,table_name, table_catalog FROM information_schema.tables WHERE table_catalog = 'YOUR TABLE CATALOG HERE' AND table_type = 'BASE TABLE' AND table_schema = 'public' ORDER BY table_name;")

请确保您填写了table_catalog(我猜它等同于数据库)。您可能需要稍微调整一下您的结果。


我认为“SHOW TABLES”是一种hack方法。information_schema是标准的做法。 - rich remer
为了遵循原始问题,需要添加LIKE条件:AND table_name LIKE 'merTrans%' - Masa Sakano

7
在Laravel中,您可以使用:
$tables = DB::select('SHOW TABLES');

6

如果你需要对所有表应用某些迁移更改。

Laravel 6中,Schema::getAllTables()成为了一个公共方法,所以你可以这样做:

$tables = array_filter(
    Schema::getAllTables(),
    static function ($table) {
        return preg_match('/some_(\d+)_table/', $table->{'Tables_in_' . env('DB_DATABASE')});
    }
);

foreach ($tables as $table ) {
    Schema::table(
        $table->{'Tables_in_' . env('DB_DATABASE')},
        static function (Blueprint $table) {
            $table->removeColumn('request_id');
        }
    );
}

当你需要做一些与表格相关的事情时(在上述情况中,是删除一列),以下命名结构的表格就会变得重要:some_1_tablesome_2_tablesome_3_table 等等。

所以,基本上你现在可以使用 Schema::getAllTables() 代替 DB::select('SHOW TABLES');


6
$tables = \DB::select("SHOW TABLES LIKE 'merTrans%'");
foreach ($tables as $table) {
  echo head($table);
}

3
请编辑您的答案以包含一些解释。仅有代码的回答对于教育未来的Stack Overflow读者帮助很少。您的答案因为质量低被放入了审核队列中。 翻译:请修改您的答案并给出一些解释。仅仅提供代码的答案无法很好地帮助未来的Stack Overflow读者学习。由于质量较低,您的答案正在等待审核。 - mickmackusa
这有点像一个 hack,因为 Laravel 的 head helper 应该用于数组而不是对象,但它能够工作是因为它基本上在传递给它的参数上调用了 reset... - guessimtoolate

5
另一个解决方案是,您不需要使用数据库名称,“current”将只使用第一列。
function getTables()
{
    $tables = DB::select('SHOW TABLES');

    $tables = array_map('current',$tables);

    return $tables;
}

4

我使用以下代码获取带列的所有表格:

$schema = collect(DB::connection()->getDoctrineSchemaManager()->listTableNames())->map(function ($item, $key) {
  return [
    'name' => $item,
    'columns' => DB::getSchemaBuilder()->getColumnListing($item)
  ];
});

2

因为我还没有足够的声望来添加评论,所以我将其发布为答案。

对于Bharat的LIKE CASES建议。

foreach ($tables as $table) {
    echo array_shift(array_values($table));
}

如果您不喜欢使用双重foreach,但确保您var_dump $table。
($tables = DB::select('SHOW TABLES');

查看您所处理的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接