我的应用程序需要一个预先注册的数据集才能工作。所以我需要在设置应用程序时将它们插入数据库。
Laravel提出了两种机制:
- Database migrations:“它们允许团队修改数据库模式并保持当前模式状态的最新状态。"
- 数据库播种:* “Laravel还包括一个简单的方法,使用种子类用测试数据来播种数据库。"*
当我读到这个描述时,这些解决方案似乎都没有被改编。
一个类似的问题是asked on stackoverflow和answered。答案建议使用数据库播种器通过检测当前环境来填充数据库:
<?php
class DatabaseSeeder extends Seeder {
public function run()
{
Eloquent::unguard();
if (App::environment() === 'production')
{
$this->call('ProductionSeeder');
}
else
{
$this->call('StagingSeeder');
}
}
}
当然,这个解决方案是有效的。但我不确定这是正确的方法,因为通过使用seeders插入数据,您将失去迁移机制提供的所有优势(数据库升级、回滚……)
我想知道在这种情况下什么是最好的做法。
5条答案
按热度按时间x3naxklr1#
Laravel的开发是关于自由的。因此,如果您需要为生产数据库播种,并且认为DatabaseSeeder是最佳的位置,为什么不呢?
好的,seeder主要用于测试数据,但是您会看到一些人像您一样使用它。
我将这类重要的种子视为迁移的一部分,因为这是数据库表中不可缺少的部分,而且每次部署应用程序的新版本时都会运行
artisan migrate
,所以我就这样做了在里面创造我的种子:
d8tt03nd2#
我经常发现自己在想什么是正确的答案。就我个人而言,我会避免使用种子来填充数据库中所需的行,因为你必须放入一个条件逻辑负载,以确保你不会试图填充已经存在的东西。(删除和重新创建数据是非常不可取的,因为你可能会以键不匹配而告终,如果你使用级联删除,你可能会不小心擦除数据库的负载!;-)
我将行的“种子”放入迁移脚本中,因为数据需要作为推出过程的一部分。
值得注意的是,你应该使用DB类而不是Eloquent模型来填充这些数据,因为你的类结构可能会随着时间的推移而改变,这将阻止你从头开始重新创建数据库(而不重写历史记录和更改迁移文件,我相信这是一件坏事)。
我倾向于这样的:
这样,当我第一次创建城镇表时,就可以很容易地为它“播种”,并且不会干扰在运行时对它进行的任何添加。
w80xi6nr3#
这就是我在生产中使用的。
由于我在每个部署上运行迁移
我创建了一个seeder(只是为了将播种数据排除在迁移之外,以便于以后访问),然后在迁移过程中运行该seeder
我没有将这个seed调用添加到seeds/DatabaseSeeder.php中,以避免在新安装中运行两次。
wz3gfoph4#
Artisan Command解决方案
1.创建新的Artisan命令
php artisan make:command UpsertConfigurationTables
1.将其粘贴到新生成的文件中:
UpsertConfigurationTables.php
1.用您想要播种的Eloquent模型填充
$_models
。1.在模型中定义种子行:
const CONFIGURATION_DATA
1.将命令添加到Laravel Forge部署脚本(或任何其他CI部署脚本):
php artisan upsert:configuration
其他值得注意的事情:
***更新插入功能:**如果您想要更改任何种子行,只需在模型中更新它们,并且在下次部署时更新数据库值。它永远不会创建重复的行。
***软删除模型:**请注意,通过将
deleted_at
设置为true
或false
来定义删除。Artisan命令将处理调用正确的方法来删除或恢复记录。其他提到的解决方案的问题:
***播种机:**在生产中运行播种机是对播种机的滥用。我担心的是,将来的工程师会改变播种器,认为这是无害的,因为文档中说明它们是为播种测试数据而设计的。
***迁移:**在迁移中播种数据是奇怪的,并且是对迁移目的的滥用。它也不允许您在迁移运行后更新这些值。
fcg9iug35#
我也碰到了这个。我最终在迁移中添加了一个artisan命令来运行seeder。