【问题标题】:DB::table Vs Eloquent Model - Laravel Database SeedDB::table Vs Eloquent 模型 - Laravel 数据库种子
【发布时间】:2016-01-14 10:52:04
【问题描述】:

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

【问题讨论】:

  • 我用关于模型工厂的注释更新了我的答案。我更喜欢简单的种子,因为它们速度很快,但模型工厂是播种时使用 Eloquent 的好方法

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


【解决方案1】:

最重要的是,因为使用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。如果您确实想使用您的设置器,或自动分配关系,并且基本上利用 Eloquent 提供的所有功能,那么它们非常适合用于播种。考虑到我提到的效率权衡,但有时这是值得的。

【讨论】:

  • 这是一个很好的答案,但是,根据this other answer,也应该可以使用MyModel::insert(...) 插入许多值,就像在您的示例中一样。这不是暗示应该弃用 DB::Table() 以支持更简单吗?
猜你喜欢
  • 1970-01-01
  • 2016-11-26
  • 2018-05-03
  • 2015-02-04
  • 2023-03-18
  • 1970-01-01
  • 2021-05-19
  • 2021-11-08
  • 2014-08-13
相关资源
最近更新 更多