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

Mar*_*leu 3 php convention laravel laravel-5 laravel-5.1

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

and*_*ber 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]
]);
Run Code Online (Sandbox Code Playgroud)

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

最后,如果确实发生了Eloquent模型的错误或问题,您的种子仍将有效.


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

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


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