Массовая вставка в Laravel с использованием красноречивой ORM

Как мы можем выполнять массовые вставки базы данных в Laravel с использованием Eloquent ORM?

Я хочу сделать это в Laravel: https://stackoverflow.com/a/10615821/600516, но я получаю следующую ошибку.

SQLSTATE [HY093]: Недопустимый номер параметра: смешанные имена и позиционные параметры.

Вы можете просто использовать Eloquent::insert() .

Например:

 $data = array( array('name'=>'Coder 1', 'rep'=>'4096'), array('name'=>'Coder 2', 'rep'=>'2048'), //... ); Coder::insert($data); 

Мы можем обновить GTF-ответ, чтобы легко обновить временные метки

 $data = array( array( 'name'=>'Coder 1', 'rep'=>'4096', 'created_at'=>date('Ymd H:i:s'), 'modified_at'=> date('Ymd H:i:s') ), array( 'name'=>'Coder 2', 'rep'=>'2048', 'created_at'=>date('Ymd H:i:s'), 'modified_at'=> date('Ymd H:i:s') ), //... ); Coder::insert($data); 

Обновление: чтобы упростить дату, мы можем использовать углерод, как предложил @Pedro Moreira

 $now = Carbon::now('utc')->toDateTimeString(); $data = array( array( 'name'=>'Coder 1', 'rep'=>'4096', 'created_at'=> $now, 'modified_at'=> $now ), array( 'name'=>'Coder 2', 'rep'=>'2048', 'created_at'=> $now, 'modified_at'=> $now ), //... ); Coder::insert($data); 

UPDATE2: для laravel 5 используйте updated_at вместо modified_at

 $now = Carbon::now('utc')->toDateTimeString(); $data = array( array( 'name'=>'Coder 1', 'rep'=>'4096', 'created_at'=> $now, 'updated_at'=> $now ), array( 'name'=>'Coder 2', 'rep'=>'2048', 'created_at'=> $now, 'updated_at'=> $now ), //... ); Coder::insert($data); 

Кто бы ни читал это, проверьте метод createMany() .

 /** * Create a Collection of new instances of the related model. * * @param array $records * @return \Illuminate\Database\Eloquent\Collection */ public function createMany(array $records) { $instances = $this->related->newCollection(); foreach ($records as $record) { $instances->push($this->create($record)); } return $instances; } 

Вот как вы это делаете более красноречиво,

  $allintests = []; foreach($intersts as $item){ //$intersts array contains input data $intestcat = new User_Category(); $intestcat->memberid = $item->memberid; $intestcat->catid= $item->catid; $allintests[] = $intestcat->attributesToArray(); } User_Category::insert($allintests); 

Или при использовании фабрик Laravel (создание 10 пользователей):

 $users = factory(App\User::class, 10)->make()->toArray(); App\User::insert($users); 

Я много раз искал это, наконец использовал пользовательские timestamps как timestamps ниже:

 $now = Carbon::now()->toDateTimeString(); Model::insert([ ['name'=>'Foo', 'created_at'=>$now, 'updated_at'=>$now], ['name'=>'Bar', 'created_at'=>$now, 'updated_at'=>$now], ['name'=>'Baz', 'created_at'=>$now, 'updated_at'=>$now], .................................. ]); 
 $start_date = date('Ymd h:m:s'); $end_date = date('Ymd h:m:s', strtotime($start_date . "+".$userSubscription['duration']." months") ); $user_subscription_array = array( array( 'user_id' => $request->input('user_id'), 'user_subscription_plan_id' => $request->input('subscription_plan_id'), 'name' => $userSubscription['name'], 'description' => $userSubscription['description'], 'duration' => $userSubscription['duration'], 'start_datetime' => $start_date, 'end_datetime' => $end_date, 'amount' => $userSubscription['amount'], 'invoice_id' => '', 'transection_datetime' => '', 'created_by' => '1', 'status_id' => '1', ), array( 'user_id' => $request->input('user_id'), 'user_subscription_plan_id' => $request->input('subscription_plan_id'), 'name' => $userSubscription['name'], 'description' => $userSubscription['description'], 'duration' => $userSubscription['duration'], 'start_datetime' => $start_date, 'end_datetime' => $end_date, 'amount' => $userSubscription['amount'], 'invoice_id' => '', 'transection_datetime' => '', 'created_by' => '1', 'status_id' => '1', ) ); dd(UserSubscription::insert($user_subscription_array)); 

UserSubscription – это мое имя модели. Это вернет «true», если вставить успешно еще «false».

Возможно, более Laravel-способ решить эту проблему – использовать коллекцию и петлю, которую она вставляет с помощью модели, использующей временные метки.

 <?php use App\Continent; use Illuminate\Database\Seeder; class InitialSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { collect([ ['name' => 'América'], ['name' => 'África'], ['name' => 'Europa'], ['name' => 'Asia'], ['name' => 'Oceanía'], ])->each(function ($item, $key) { Continent::forceCreate($item); }); } } 

РЕДАКТИРОВАТЬ:

Извините за мое недоразумение. Для массового вставки это может помочь, и, возможно, с этим вы можете сделать хорошие сеялки и немного их оптимизировать.

 <?php use App\Continent; use Carbon\Carbon; use Illuminate\Database\Seeder; class InitialSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $timestamp = Carbon::now(); $password = bcrypt('secret'); $continents = [ [ 'name' => 'América' 'password' => $password, 'created_at' => $timestamp, 'updated_at' => $timestamp, ], [ 'name' => 'África' 'password' => $password, 'created_at' => $timestamp, 'updated_at' => $timestamp, ], [ 'name' => 'Europa' 'password' => $password, 'created_at' => $timestamp, 'updated_at' => $timestamp, ], [ 'name' => 'Asia' 'password' => $password, 'created_at' => $timestamp, 'updated_at' => $timestamp, ], [ 'name' => 'Oceanía' 'password' => $password, 'created_at' => $timestamp, 'updated_at' => $timestamp, ], ]; Continent::insert($continents); } }