如何在 laravel 中获取所有模型/迁移名称并添加单个新列

Posted

技术标签:

【中文标题】如何在 laravel 中获取所有模型/迁移名称并添加单个新列【英文标题】:How to get all models/migrations names in laravel and add single new column 【发布时间】:2017-12-20 16:12:23 【问题描述】:

我在数据库中有 88 个表,我需要在每个表中添加一个新列,一个单一的解决方案是我进行迁移并为所有表编写 88 个函数以添加新列以及 88 个函数以删除该列。

有什么方法可以获取 1 个变量中的所有表名,然后使用 foreach 通过一段代码添加一个新列?

    获取变量中的所有表名

    by foreach 循环将新列添加到该特定变量

$allTables=?
foreach($allTables as $singleTable)
    add new column

但是怎么做? 我想在所有表格中添加team_id,但我需要一个最佳解决方案。

我使用的是 laravel 5.4 版本。

【问题讨论】:

【参考方案1】:

试试下面的。

// Get the default database name
$dbName = config('database.connections.' . config('database.default') . '.database');

$tables = DB::select('SHOW TABLES');

foreach($tables as $table)

    Schema::table($table->'Tables_in_' . $dbName, function($table) 
        // Add the column
        $table->string('some_column');
    );

要了解发生了什么,请分析 $tables 变量,但应该非常简单。

【讨论】:

这对我来说非常棒,非常感谢您的回复,爱你 【参考方案2】:

我已经尝试过了,它也可以工作,但your solution 比这更好,@Artur。

class AddTeamIdToNecessaryTables extends Migration

    protected $table_names;

    function __construct()
    
        $this->table_names = [
            'accounts', 'suppliers', 'expenses', 'draft_invoices', 'quote_jobs',
            'committed_invoices', 'quotes', 'rate_plans', 'call_categories',
            'prefix_groups', 'draft_items', 'committed_invoice_cdrs', 'committed_items',
            'call_data_records', 'committed_temp_xero_infos', 'did_records',
            'prefixes', 'prefix_cost_prices', 'purchase_items', 'purchase_orders',
            'quote_costs', 'sippy_root_accounts', 'temp_xero_infos', 'sippy_infos', 'committed_jobs'
        ];
    

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        \DB::beginTransaction();
        try 
            foreach ($this->table_names as $table_name) 
                Schema::table($table_name, function (Blueprint $table) 
                    $table->integer('team_id')->unsigned()->nullable()->after('id');
                    $table->foreign('team_id')->references('id')->on('teams');
                );
            
            \DB::commit();
         catch (\Exception $e) 
            \DB::rollback();
        
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        \DB::beginTransaction();
        try 
            foreach ($this->table_names as $table_name)
                Schema::table($table_name, function (Blueprint $table) 
                    $table->dropForeign(['team_id']);
                    $table->dropColumn('team_id');
                );
            
            \DB::commit();
         catch (\Exception $e) 
            \DB::rollback();
        
    

【讨论】:

以上是关于如何在 laravel 中获取所有模型/迁移名称并添加单个新列的主要内容,如果未能解决你的问题,请参考以下文章

如何获取已存储在另一个模型中的名称 ID,并使用名称 ID 在 laravel 的数据透视表数据库中存储值?

Laravel 模型查找旧表名

Laravel 获取所有具有关系的模型

laravel-mongodb中如何获取数据库中所有表的名称

如何获取 Laravel 中所有模型的列表?

如何使用一个命令在 laravel 中创建所有三个文件(控制器、模型和数据库迁移文件)