Eloquent ORMを使用したLaravelでの一括挿入
質問
Eloquent ORMを使用してLaravelで一括データベース挿入を実行するにはどうすればよいですか?
私は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('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);
.
更新: @ eddro 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);
. 私はそれに対して何度も検索し、ついに以下のようにカスタム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],
..................................
]);
. Eloquent::insert
は適切な解決策ですが、タイムスタンプを更新しているので、下のようなものをすることができます
$json_array=array_map(function ($a) {
return array_merge($a,['created_at'=>
Carbon::now(),'updated_at'=> Carbon::now()]
);
}, $json_array);
Model::insert($json_array);
.
INSERT
を実行する前に、recthed_atとupdated_atを配列全体に追加することです。カテゴリ関係挿入のために私は同じ問題に遭遇し、私の極度のモデルでは、私がself()を使用していたことを除いて、私はself()を使って同じクラスのインスタンスを使用して複数の保存とgreabing idsを記録します。
foreach($arCategories as $v)
{
if($v>0){
$obj = new Self(); // this is to have new instance of own
$obj->page_id = $page_id;
$obj->category_id = $v;
$obj->save();
}
}
.
$ obj= new self() "単一のレコードのみを保存するだけです($ objが$ $ this)
$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
は私のモデル名です。
insertが「false」に成功したら、これは "true"を返します。
この問題を解決するためのよりラベルの良い方法は、タイムスタンプを利用してモデルを挿入するコレクションを使用してループすることです。
<?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);
}
}
. 解決した問題...........マイグレーションのためのALTER TABLE ...
$table->timestamp('created_at')->nullable()->useCurrent();
.
Easy
Schema::create('spider_news', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('source')->nullable();
$table->string('title')->nullable();
$table->string('description')->nullable();
$table->string('daterss')->nullable();
$table->timestamp('created_at')->nullable()->useCurrent();
$table->timestamp('update_at')->nullable()->useCurrent();
});
.