Как мы можем выполнять массовые вставки базы данных в 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); } }