DB::table 对比 Eloquent 模型 - Laravel 数据库种子
DB::table Vs Eloquent Model - Laravel Database Seed
在研究 Database Seeder 时,经常看到人们在 Seeder 类 中使用 DB::table('my_table')->insert(['column' => 'value'])
。我想知道为什么我 应该 使用 DB::*
而不是 MyModel::*
来执行此类任务的明显约定背后的原因。
最重要的是,因为使用 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 class 或它附带的任何批量。同样,播种数千行,创建数千个 Eloquent 对象...可能会占用大量内存。
最后,如果 Eloquent 模型确实存在错误或问题,您的种子仍然有效。
有一些缺点。例如,如果您的 Eloquent 模型之一覆盖了 setter 以在保存之前操作和格式化数据,那么您将失去这种便利。
实际上,这适用于任何带有 $timestamps 的模型;对于 DB
插入,您必须手动设置 created_at
和 updated_at
时间戳。但是使用播种机,您可能希望模拟项目是几天前、几个月前或几年前创建的,在这种情况下,您不会希望自动设置这些时间戳。
但实际上,确实有很多人使用model factories。如果您确实想使用 setter 或自动分配关系,并且基本上利用 Eloquent 提供的一切,那么它们非常适合用于播种。有了我提到的效率权衡,但有时这是值得的。
在研究 Database Seeder 时,经常看到人们在 Seeder 类 中使用 DB::table('my_table')->insert(['column' => 'value'])
。我想知道为什么我 应该 使用 DB::*
而不是 MyModel::*
来执行此类任务的明显约定背后的原因。
最重要的是,因为使用 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 class 或它附带的任何批量。同样,播种数千行,创建数千个 Eloquent 对象...可能会占用大量内存。
最后,如果 Eloquent 模型确实存在错误或问题,您的种子仍然有效。
有一些缺点。例如,如果您的 Eloquent 模型之一覆盖了 setter 以在保存之前操作和格式化数据,那么您将失去这种便利。
实际上,这适用于任何带有 $timestamps 的模型;对于 DB
插入,您必须手动设置 created_at
和 updated_at
时间戳。但是使用播种机,您可能希望模拟项目是几天前、几个月前或几年前创建的,在这种情况下,您不会希望自动设置这些时间戳。
但实际上,确实有很多人使用model factories。如果您确实想使用 setter 或自动分配关系,并且基本上利用 Eloquent 提供的一切,那么它们非常适合用于播种。有了我提到的效率权衡,但有时这是值得的。