Laravel 5 - 部署应用程序后如何自动播种表?

Posted

技术标签:

【中文标题】Laravel 5 - 部署应用程序后如何自动播种表?【英文标题】:Laravel 5 - How to seed table automatically after deploying an app? 【发布时间】:2017-01-03 23:41:46 【问题描述】:

我的应用程序必须在表格中才能运行某些数据,否则我会收到错误消息。

例如,如果您或其他任何人从 github 拉出我的应用程序,并且如果您运行 php artisan migrate 然后尝试测试该应用程序,您会收到错误: 数据不存在或类似的东西。 这是因为表中没有数据。

所以理想的解决方案是在运行之后:

 php artisan migrate

您还可以在该表中获得所需的数据。

这应该通过播种机以某种方式完成,但我不知道如何。谁能帮我举个例子?

如何为应该进入 car_company 表的数据创建种子:

id car_company

1 大众汽车

2 奔驰

3 奥迪

4 保时捷

有 4 行,我想在运行后插入它们

 php artisan db:seed

【问题讨论】:

我已经使用了具有此功能的 PHP 应用程序。我计划自己编写一个脚本来执行此操作。我这样做的方式只是在应用程序的初始化阶段添加一个检查。您可以检查源代码的迁移次数,然后查询数据库中的迁移跟踪表,如果数据库在代码库后面,您可以停止应用程序的执行并打印一条消息 - 你需要运行迁移 是的,我只是想在第一次运行迁移后做这个种子,所以表中有这些数据,以便应用程序完全正常运行! 嗯,我认为问题更多的是检测和显示消息。创建一个 shell 别名或简单地执行这两个命令的东西很简单,但是你需要教育人们他们需要学习、定位和使用你的新脚本/命令。但是人们已经知道你不能使用数据库,除非它是种子的。播种的工匠命令已经是常识。另一个问题是,当您将播种之类的事情自动化时,您将无法控制播种发生的时间,因此数据库可能会在您不想要的时候被播种。 这就是为什么我认为要么停止应用程序执行并向开发人员打印一条 DB 未正确更新的消息,并可能提供一个配置选项,让他们覆盖消息并强制使用过时的 DB如果他们想忽略这些消息。或者打印到日志文件。他们的问题是是否会监视日志文件。 是的,但是您对配置的了解太深了运行 2 个命令: 1. php artisan migrate 这是很正常的事情,每个人都知道它和 2. php artisan db:seed 我不知道如何为我的表中的 10 个新插入创建种子。这就是这里的问题,没有别的。 【参考方案1】:

首先运行以下命令:

php artisan make:seeder CarCompanyTableSeeder。这将在 database\seeds 中创建类 CarCompanyTableSeeder

在函数public function run()里面添加如下代码:

public function run()
    
        $data = array(
            array(
                'id'            =>    1,
                'car_company'   =>   'Volkswagen'
            ),
            array(
                'id'            =>    2,
                'car_company'   =>   'Mercedes'
            ),
            array(
                'id'            =>    3,
                'car_company'   =>   'Audi'
            ),
            array(
                'id'            =>    4,
                'car_company'   =>   'Porsche'
            )
        );

        DB::table('car_company')->insert($data);
    

database\seeds 中还有另一个类class DatabaseSeeder extends Seeder。在类里面有一个函数run()。在此处添加以下代码:

public function run()
    
        Model::unguard();

        $this->call(CarCompanyTableSeeder::class);

        Model::reguard();
    

现在,当你运行 php artisan db:seed 时,你想要的值就会被插入到那里。

【讨论】:

@Rumel 这是所有答案应该是什么样子的示例! 谢谢@lewis4u。很高兴我的回答对您有所帮助。 :) 无意冒犯(@Marcin Nabiałek 和@Ray Cheng)你可能更有经验,这样做对你来说可能是一件微不足道的事情,也许你没有时间像 Rumel 那样把它全部写出来做过。我的观点是,这样的答案值得尊重,它肯定会比写下可以找到答案的地方更有帮助。很容易写:“只要谷歌它!”但这不是 Stack Overflow 的重点……这只是我的意见,您不必同意!【参考方案2】:

运行php artisan migrate后,你需要运行php artisan db:seed, 要将种子写入数据库,您可以按照以下说明操作:https://laravel.com/docs/5.2/seeding#using-model-factories

另一个有用的包是:https://github.com/fzaninotto/Faker,帮助你伪造数据到数据库。

【讨论】:

fzaninottot/Faker 创建虚拟数据,我希望插入我的数据。例如,我有一个表 car_company,并且我希望在我运行 php artisan db:seed id car_company 1 Volkswagen 2 Mercedes 3 Audi 4 Porsche 后将这些字段播种到我的表中这个种子应该是什么样子? @lewis4u,如果您想要确切的数据,您应该将数据转储到 xxx.sql 文件中,然后在下次迁移后导入。或者在种子文件中写入静态数据。 好的,我明白了...我可以导出数据,但是如何使用 laravel 导入它。那可能吗?或者我必须使用 DBMS 或 phpmyadmin? @lewis4u,从shell命令你可以使用这个命令mysql -uroot (-ppasswd) databasename < sqlfilename.sql来导入数据库,我想你可以写一个shell,然后用php来执行shell。 好的,可以,但仍然......我想有一个种子来填写我的数据:(【参考方案3】:

目前,对于这种情况,我使用数据库迁移。您不需要在迁移中只创建数据库结构,但您也可以在迁移中将数据添加到数据库中,这样就足以运行php artisan migrate 来创建数据库结构并在数据库中创建所需的数据。

【讨论】:

请问你能做一个在表中插入多行的迁移示例吗?例如在我的问题中,如果我有一个迁移来创建一个表 car_companys(带有字段 id 和 name)并且我想插入 2 行:BMW 和 AUDI....那会是什么样子?

以上是关于Laravel 5 - 部署应用程序后如何自动播种表?的主要内容,如果未能解决你的问题,请参考以下文章

更新到 Laravel 5.3 后播种时调用未定义的方法 Illuminate\Database\Query\Builder::lists()

迁移后的 Laravel 种子

在更新到Laravel 5.3后播种时调用未定义的方法Illuminate Database Query Builder :: lists()

如何使用数据库将数据从一个表导入另一个表:播种? (laravel 5.3)?

laravel 5.4中的动态播种

Laravel 5 应用命名空间