Eloquent ORM을 사용하여 Laravel에서 대량 데이터베이스 삽입을 어떻게 수행 할 수 있습니까?
Laravel 에서이 작업을 수행하려고합니다 : https : //.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);
업데이트 : @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);
업데이트 2 : 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()
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;
}
답변
이것이 당신이 좀 더 Eloquent 방식으로하는 방법입니다.
$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);
아이디어는 삽입하기 전에 전체 배열에 created_at 및 updated_at를 추가하는 것입니다
답변
Laravel 5.7부터 Illuminate\Database\Query\Builder
insertUsing 메소드를 사용할 수 있습니다.
$query = [];
foreach($oXML->results->item->item as $oEntry){
$date = date("Y-m-d H:i:s")
$query[] = "('{$oEntry->firstname}', '{$oEntry->lastname}', '{$date}')";
}
Builder::insertUsing(['first_name', 'last_name', 'date_added'], implode(', ', $query));