При поиске Сеанса базы данных часто можно увидеть людей, использующих DB::table('my_table')->insert(['column' => 'value'])
в классах сеялки. Я хотел бы знать причину этого очевидного соглашения о том, почему я должен использование DB::*
вместо MyModel::*
выполнять такие задачи.
Самое главное, потому что с DB
вставки, вы можете сделать несколько вставок одновременно. Особенно при заполнении большого количества больших таблиц, это намного, намного быстрее, чем выполнение одного запроса на вставку.
http://laravel.com/docs/master/queries#inserts
DB::table('users')->insert([
['email' => '[email protected]', 'votes' => 0],
['email' => '[email protected]', 'votes' => 0]
]);
Вам также не нужно загружать класс Eloquent или какой-либо объем, который поставляется вместе с ним. Опять же, посекая тысячи строк, создавая тысячи объектов Eloquent …, которые могут занимать много памяти.
И, наконец, если есть ошибки или проблемы с моделями Eloquent, ваши семена все равно будут работать.
Есть некоторые недостатки. Например, если одна из ваших моделей Eloquent переопределяет установщик для манипулирования и форматирования данных перед их сохранением, то вы теряете это удобство.
И на самом деле это относится к любой модели с $ timestamps; с DB
вставки вы должны будете установить created_at
а также updated_at
метки времени вручную. Но с сеялкой вы можете смоделировать, что предметы были созданы дни, месяцы или годы назад, и в этом случае вы бы не стали хочу эти отметки времени будут установлены автоматически.
Но на самом деле, многие люди используют модельные фабрики. Если вы действительно хотите использовать свои сеттеры или автоматически назначать отношения и в основном использовать все, что предлагает Eloquent, тогда они отлично подходят для заполнения. С компромиссами эффективности я упомянул, но иногда это того стоит.
Других решений пока нет …