如何使用雄辯ORM在Laravel中執行批量數據庫插入?使用雄辯ORM批量插入Laravel
我想在Laravel中完成此操作:https://stackoverflow.com/a/10615821/600516 但我收到以下錯誤消息。
SQLSTATE [HY093]:無效的參數編號:混合的名稱和位置參數。
如何使用雄辯ORM在Laravel中執行批量數據庫插入?使用雄辯ORM批量插入Laravel
我想在Laravel中完成此操作:https://stackoverflow.com/a/10615821/600516 但我收到以下錯誤消息。
SQLSTATE [HY093]:無效的參數編號:混合的名稱和位置參數。
我們可以更新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莫雷拉建議
$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
代替o ˚Fmodified_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);
的數組中手動設置created_at,updated_at字段,或者在腳本開頭使用Carbon來定義一個'$ now'變量:'$ now = Carbon: :現在( 'UTC') - > toDateTimeString();'。然後,只需使用''created_at'=> $ now,'updated_at'=> $ now'即可。 –
我們如何獲得新插入的行的所有ID? – akshaykumar6
它在Laravel 5中名爲** updated_at **。 – Ben
$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」。
無論誰在閱讀本文,請查看createMany()
method。
/**
* 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);
也許更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);
}
}
這使每個項目一個查詢。這不是批量插入。 –
@EmileBergeron我同意你的意見。我編輯了我的帖子,所以也許這可能有助於批量插入。考慮到將任務花費很多時間(碳,加密),這可以爲您節省大量時間。 –
我搜索了很多次,最後用自定義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],
..................................
]);
你有你的機型'has_many'關係? – PapaSmurf
@jonathandey不,我目前沒有任何關係 – phoenixwizard
@DavidBarker我已經嘗試使用for循環形成quesr字符串。我也嘗試在laravel中使用事務。 – phoenixwizard