Массовая вставка в Laravel с использованием eloquent ORM
Как мы можем выполнять массовые вставки базы данных в Laravel с помощью Eloquent ORM?
Я хочу сделать это в Laravel: https://stackoverflow.com/a/10615821/600516
но я получаю следующую ошибку.
SQLSTATE[HY093]: недопустимый номер параметра: смешанные именованные и позиционные параметры.
8 ответов:
Вы можете просто использовать
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('Y-m-d H:i:s'), 'modified_at'=> date('Y-m-d H:i:s') ), array( 'name'=>'Coder 2', 'rep'=>'2048', 'created_at'=>date('Y-m-d H:i:s'), 'modified_at'=> date('Y-m-d 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);
Я искал его много раз, наконец, использовал custom
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('Y-m-d h:m:s'); $end_date = date('Y-m-d 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 (создание 10 пользователей):
$users = factory(App\User::class, 10)->make()->toArray(); App\User::insert($users);
возможно, более 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); }); } }EDIT:
извините за мое недопонимание. Для массовой вставки это может помочь, и, возможно, с этим вы можете сделать хорошие сеялки и немного оптимизировать их.
<?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); } }
Comments