[php] 웅변 ORM을 사용하여 라 라벨에 대량 삽입

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\BuilderinsertUsing 메소드를 사용할 수 있습니다.

$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));