Cách chèn nhiều hàng từ một truy vấn bằng cách sử dụng hùng biện / lưu loát


143

Tôi có câu hỏi sau:

  $query = UserSubject::where('user_id', Auth::id())->select('subject_id')->get();

và như mong đợi, tôi nhận được kết quả như sau:

[{"user_id":8,"subject_id":9},{"user_id":8,"subject_id":2}]

Có cách nào sao chép kết quả trên vào một bảng khác để bảng của tôi trông như thế này không?

ID|user_id|subject_id
1 |8      |9
2 |8      |2

Vấn đề tôi gặp phải là $querycó thể mong đợi bất kỳ số lượng hàng nào và vì vậy tôi không chắc chắn làm thế nào để lặp qua một số lượng hàng không xác định.


trong trường hợp bất cứ ai vẫn cần nó: github.com/laravel/framework/issues/1295#issuecomment-193025045
4givN

Câu trả lời:


292

Thật sự dễ dàng để thực hiện một số lượng lớn chèn vào Laravel bằng Eloquent hoặc trình xây dựng truy vấn.

Bạn có thể sử dụng phương pháp sau.

$data = [
    ['user_id'=>'Coder 1', 'subject_id'=> 4096],
    ['user_id'=>'Coder 2', 'subject_id'=> 2048],
    //...
];

Model::insert($data); // Eloquent approach
DB::table('table')->insert($data); // Query Builder approach

Trong trường hợp của bạn, bạn đã có dữ liệu trong $querybiến.


7
Sử dụng phương thức -> toArray () trên bộ sưu tập đối tượng.
Kreshnik Hasanaj

35
Nó không chèn dấu thời gian.
guys_fawkes

20
thêm 'created_at' => date ('Ymd H: i: s'), 'mod_at' => date ('Ymd H: i: s') vào mảng của bạn. nguồn: stackoverflow.com/a/26569967/1316842
JR Tan

8
Tôi tự hỏi tại sao Laravel không có cái gì đó như 'createdMany' cho việc này.
Abhishek

4
Làm thế nào để tôi lấy ids?
Luvias

21

sử dụng hiệu quả

$data = array(
    array('user_id'=>'Coder 1', 'subject_id'=> 4096),
    array('user_id'=>'Coder 2', 'subject_id'=> 2048),
    //...
);

Model::insert($data);

insert là phương thức của trình xây dựng truy vấn. Accessor và mutators sẽ không hoạt động với phần chèn này
Hassan Dad Khan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.