DB :: table Vs Eloquent Model - Laravel数据库种子

时间:2015-10-15 20:14:28

标签: php laravel laravel-5 laravel-5.1 convention

在研究Database Seeder时,人们常常看到人们在Seeder课程中使用DB::table('my_table')->insert(['column' => 'value'])。我想知道这个明显惯例背后的原因,为什么我应该使用DB::*代替MyModel::*执行此类任务。

1 个答案:

答案 0 :(得分:6)

最重要的是,因为插入DB,您可以一次执行多个插入操作。特别是当播种许多大型表时,这比每次插入一次查询要快得多。

http://laravel.com/docs/master/queries#inserts

DB::table('users')->insert([
    ['email' => 'taylor@example.com', 'votes' => 0],
    ['email' => 'dayle@example.com', 'votes' => 0]
]);

您也不需要加载Eloquent类或其附带的任何批量。再次,播种数千行,创建数以千计的Eloquent对象......这可能占用大量内存。

最后,如果确实存在与Eloquent模型有关的错误或问题,您的种子仍将有效。

有一些缺点。例如,如果您的一个Eloquent模型在保存之前覆盖了一个setter来操作和格式化数据,那么您将失去这种便利。

实际上,这适用于任何带有$ timestamps的模型;使用DB插入时,您必须手动设置created_atupdated_at时间戳。但是使用播种机,您可能希望模拟项目是在几天或几个月或几年前创建的,在这种情况下,您不会想要自动设置这些时间戳。

但实际上,很多人都使用model factories。如果你确实想要使用你的setter,或者自动分配关系,并且基本上利用了Eloquent提供的所有东西,那么它们非常适合用于播种。通过我提到的效率权衡,但有时这是值得的。