【问题标题】:Default content of DB tables in LaravelLaravel 中 DB 表的默认内容
【发布时间】:2019-01-27 17:30:54
【问题描述】:

我正在学习 Laravel,但有一个我自己也搞不清楚的问题。 因此,例如,我有像 citiescar_models 这样的 DB 表以及它们的迁移。但是我不想每次迁移时手动填充这些表:刷新或部署测试/生产服务器上的项目,所以它们必须有一些默认内容。

可以在迁移中直接填充它们吗?或者这就是播种机的用途? (据我了解,它们是用于使用一些虚假数据填充表格以满足测试需求)

【问题讨论】:

    标签: mysql database laravel migration


    【解决方案1】:

    migration 用于创建表,而 seeder 用于将虚拟数据插入到数据库中的表中。您可以在迁移中填充它们,但这不是一个好的做法,可能会导致混乱。

    【讨论】:

    • "您可以在迁移中填充它们,但这不是一个好的做法,可能会导致混乱。"取决于代码是应用程序的更新还是使用数据库配置记录进行迁移的新创建的应用程序使用起来非常合理......因为没有一个好的数据库版本控制数据库系统。跨度>
    【解决方案2】:

    两个答案都是正确的。但他们遗漏了一些重要的东西。

    在我看来,使用 Seeder 类的最重要价值是您将迁移与填充逻辑分离。

    为什么这很重要?你有很多答案:

    • 代码质量。
    • 支持几个 SOLID 原则。
    • 良好做法。
    • 更好地理解您的代码。
    • 更清洁的 API。

    但对我来说,最重要的是这让您使用相同的代码为不同的porpuses 获得不同的结果。这是一个例子:

    您在迁移文件中编写播种器/种群逻辑。如果您想在production 环境中部署您的应用程序会发生什么?好吧,您需要修改迁移以避免包含虚拟数据的功能,然后提交这些更改并将它们上传到服务器。如果您需要在不同的环境中部署它(例如staging),您需要再次更改它。

    相反,如果您创建特定的类来填充您的数据库 (Seeders),您可以灵活地使用相同的代码并使用命令标志包含(或相反)它们:

    // The following won't include your seeders
    php artisan migrate
    
    // This will include your seeder classes
    php artisan migrate --seed
    

    您可以更细化,指定特定的播种器:

    php artisan migrate
    php artisan db:seed --class=UsersTableSeeder
    

    当您只想填充环境中的几个表(如rolestypescities 等)而不是运行所有播种器(usersorders)时,这很有帮助, reservations, ...)。

    我希望这会有所帮助。

    【讨论】:

    • 但如果不是虚拟数据,而是像我希望在部署项目的任何地方出现的真实城市列表?但是除了最后一个之外,所有的原因都很好理解为什么我应该用第二种方式。
    • @Zlautumn 这就是我提到最后一行(细粒度的)的原因。当我想填充一些主表(citiestypes 等)时,我会使用此选项。
    • 既然你已经指出了,我完全明白了!非常感谢!
    猜你喜欢
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2014-09-06
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多