2015-10-15 57 views
2

在研究數據庫搜索器時,通常會在Seeder類中看到使用DB::table('my_table')->insert(['column' => 'value'])的人。我想知道爲什麼我應該使用而不是MyModel::*來執行這樣的任務,這種明顯的約定背後的原因。DB :: table Vs雄辯模型 - Laravel數據庫種子

+1

我用關於模型工廠的註釋更新了我的答案。我更喜歡簡單的種子,因爲它們速度很快,但模型工廠是播種時使用雄辯的好方法 – andrewtweber

回答

4

最重要的是,因爲使用DB插入,您可以一次執行多個插入操作。特別是在播種許多大型表格時,這比每插入一次查詢要快得多。

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

DB::table('users')->insert([ 
    ['email' => '[email protected]', 'votes' => 0], 
    ['email' => '[email protected]', 'votes' => 0] 
]); 

你也不需要加載雄辯類或任何隨之而來的大頭。再次,播種數千行,創建數千個Eloquent對象......這會佔用大量內存。

最後,如果確實發生了錯誤或問題與雄辯模型,您的種子仍然會工作。


有一些缺點。例如,如果你的一個Eloquent模型覆蓋了一個setter在保存之前操縱和格式化數據,那麼你就失去了這種便利。

實際上,它適用於任何帶有$ timestamps的模型;與DB插入,你將不得不手動設置created_atupdated_at時間戳。但是對於播種機,您可能想要模擬那些項目是在幾天或幾個月或幾年前創建的,在這種情況下,您不會想要自動設置這些時間戳。


但實際上,很多人都使用model factories。如果你想要使用你的setter,或者自動分配關係,並基本上利用雄辯提供的一切優勢,那麼他們非常適合用於播種。通過我提到的效率折衷,但有時候這是值得的。