2016-09-22 29 views
10

Tôi cần chèn một bộ bản ghi lớn vào bảng cơ sở dữ liệu. Tôi đang nhận dữ liệu từ tệp CSV. Tôi đã nghĩ đến việc sử dụng câu lệnh multi-insert cho hiệu năng tốt. Vì vậy, tôi đã làm một cái gì đó tương tự như sau:Vấn đề Laravel Multi Insert với dấu ngoặc kép có giá trị

foreach($data as $key => $value) { 

    $insert[] = [ 
       'id' => $value->id, 'is_published' => $value->is_published, 
       "first_name" => $value->first_name, "middle_name" => $value->middle_name, "last_name" => $value->last_name, 
       "description" => $value->description, 
       "created_at" => date("Y-m-d H:i:s",strtotime($value->created_at)), 
       "updated_at" => date("Y-m-d H:i:s",strtotime($value->changed_at)) 
      ]; 
} 

if(!empty($insert)){ 
    Model::insert($insert); 
} 

Nhưng khi làm như vậy tôi luôn luôn thấy lỗi:

mysql server gone away error.

tôi đã sửa lỗi nó bằng cách in các truy vấn và tôi quan sát thấy rằng bằng cách làm như vậy, Laravel không quan tâm đến dấu nháy đơn hoặc dấu ngoặc kép trong giá trị mô tả, vì nó tự động thực hiện trong khi sử dụng $model::save();. Phiên bản truy vấn được in bị hỏng nếu giá trị mô tả có dấu ngoặc đơn ' hoặc dấu ngoặc kép " trong đó.

Nhưng nếu tôi làm một số điều như

foreach($data as $key=>$value){ 
    $model = new Model(); 
    $model->id = $value->id; 
    $model->description = $value->description; 
    blah blah bla 

    $model->save(); 
} 

Nó chạy thành công mà không tạo ra bất kỳ lỗi. Ai có thể cho tôi biết làm thế nào để sửa vấn đề này?

+0

Vui lòng sử dụng giao dịch laravel để chèn nhiều bản ghi. – Komal

+0

@Komal Và nó liên quan đến vấn đề của tôi như thế nào? –

+1

hành vi khủng khiếp ... Tôi không thực hiện chèn khối lượng, nhưng tôi sẽ thử điều này: 'str_replace ('"', '\ "', $ value-> description)', chỉ là một ý tưởng ... –

Trả lời

2

Do số lượng lớn dữ liệu không có vấn đề gì với báo giá. Khi bạn đang cố gắng chèn tất cả các hàng cùng một lúc bằng cách sử dụng đa chèn, tập dữ liệu trở nên quá nặng. Hoặc bạn cần phải tăng max_allowed_packet hoặc bạn cần phải làm trong khối. Bạn có thể sử dụng chunk cho điều đó. giả sử bạn muốn chèn 100 phần tử cùng một lúc. bạn có thể làm một cái gì đó như thế.

if(!empty($insert)) 
{ 

    $collection = collect($insert)->chunk(100)->toArray(); 

    foreach ($collection as $insert) 
    { 
     // It will insert 100 items at a time 

     Model::insert($insert); 
    } 

} 

Hy vọng điều này sẽ giúp :)

+0

Vui lòng đọc lại câu hỏi của tôi –

+1

@AwaisQarni Tôi nghĩ câu trả lời này thực sự giải quyết được vấn đề, vì máy chủ MySQL có Lỗi đi xa có thể là do truy vấn quá lâu, không phải dấu ngoặc kép. – Skysplit

+0

chấp nhận câu trả lời này là chính xác làm cho câu hỏi khá vô giá trị (không có gì sai với câu trả lời, đây là dự đoán của tôi, quá) –

0

Bạn đang cố chèn bao nhiêu bản ghi? Bạn có thể thử chỉ với hai không? Bạn có thể cố gắng chèn số lượng lớn hàng loạt (chẳng hạn như 100 x 100).

Thông thường, lỗi Mysql has gone away có nghĩa là máy chủ cơ sở dữ liệu đã hủy truy vấn vì nó đang chờ quá nhiều dữ liệu (truy vấn của bạn quá lớn).

Bạn thường có thể đặt giá trị cao hơn thành max_allowed_packet var trong my.conf để cho phép bạn gửi nhiều dữ liệu hơn cùng một lúc.

+0

Vui lòng đọc lại câu hỏi của tôi –

Các vấn đề liên quan