Как вставить несколько строк из одного запроса, используя eloquent / fluent


143

У меня есть следующий запрос:

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

и, как и ожидалось, я получаю следующий результат:

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

Есть ли способ скопировать приведенный выше результат в другую таблицу, чтобы моя таблица выглядела так?

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

У меня проблема в том, что $queryможет ожидать любое количество строк, и поэтому я не уверен, как перебирать неизвестное количество строк.


на тот случай, если кому-то еще это нужно: github.com/laravel/framework/issues/1295#issuecomment-193025045
4

Ответы:


292

Сделать массовую вставку в Laravel действительно просто, используя Eloquent или построитель запросов.

Вы можете использовать следующий подход.

$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

В вашем случае у вас уже есть данные в $queryпеременной.


7
Используйте метод -> toArray () для коллекции объектов.
Крешник Хасанай

35
Он не вставляет метки времени.
guy_fawkes

20
добавьте 'create_at' => date ('Ymd H: i: s'),'ified_at '=> date (' Ymd H: i: s ') в ваш массив. источник: stackoverflow.com/a/26569967/1316842
JR Tan

8
Интересно, почему у Laravel нет для этого чего-то вроде createMany.
Абхишек

4
Как я могу получить идентификаторы?
Лувиас

21

используя Eloquent

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

Model::insert($data);

insert - это метод построения запросов. Аксессор и мутаторы не будут работать с этой вставкой
Хасан Дад Хан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.