在研究Database Seeder时,人们常常看到人们在Seeder课程中使用DB::table('my_table')->insert(['column' => 'value'])
。我想知道这个明显惯例背后的原因,为什么我应该使用DB::*
代替MyModel::*
执行此类任务。
答案 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_at
和updated_at
时间戳。但是使用播种机,您可能希望模拟项目是在几天或几个月或几年前创建的,在这种情况下,您不会想要自动设置这些时间戳。
但实际上,很多人都使用model factories。如果你确实想要使用你的setter,或者自动分配关系,并且基本上利用了Eloquent提供的所有东西,那么它们非常适合用于播种。通过我提到的效率权衡,但有时这是值得的。