Как сохранить несколько данных с разным количеством данных одновременно? - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть cv таблица, таблица пользователя и таблица общего доступа. Структура таблицы общего ресурса shareto_id, cv_id, user_id

Может быть любое количество shareto_id и cv_id. Предположим, я хочу сохранить (1) shareto_id и (2) cv_id. Но он сохраняет только одну информацию в базе данных. это код, который я уже пробовал.

$cv_id = explode(",",$cvids);
$shareto_id = explode(",",$sharetoids);
$cvlength = count($cv_id);
$sharetolength = count($shareto_id);
for($i=0; $i<$cvlength; $i++)
{
  for($j=0; $j<$sharetolength; $j++)
  {
     $data['cv_id'] = $cv_id[$i];
     $data['user_id'] = $request->user_id;
     $data['shareto_id']= $shareto_id[$j];
  }
}    
Share::create($data);

Ответы [ 4 ]

1 голос
/ 01 ноября 2019

Если я правильно понимаю ваш вопрос, вы должны переместить create в цикл:

for ($i = 0; $i < $cvlength; $i++) {
    for ($j = 0; $j < $sharetolength; $j++) {
        $data['cv_id']      = $cv_id[$i];
        $data['user_id']    = $request->user_id;
        $data['shareto_id'] = $shareto_id[$j];
        Share::create($data);
    }
}

или использовать insert, как описано здесь

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

1 голос
/ 01 ноября 2019

$data - это всего лишь один массив с 3 элементами. Каждую итерацию этого цикла вы переназначаете $data['cv_id'], $data['user_id'], $data['shareto_id'], чтобы предыдущие значения исчезали.

Вам необходимо сохранять предыдущие значения, создавая новые массивы элементов для добавления восновная коллекция:

$data = [];

for (...) {
    for (...) {
        $data[] = [
            'cv_id' => $cv_id[$i],
            'user_id' => $request->user_id,
            'shareto_id' => $shareto_id[$j],
        ];
    }
}

Метод create в Eloquent Builder предназначен для создания 1 нового экземпляра модели и сохранения его не для многих.

Если вы хотите выполнить массовую вставку и частичноОбойти Eloquent вы можете использовать метод Query Builder insert.

Share::insert($data);
0 голосов
/ 01 ноября 2019

Не вставляйте новую запись, используя цикл. Мы можем создать запрос необработанной вставки, например

insert into "Table_name" ('cv_id','user_id','shareto_id')VALUES (cv_id_value_1, user_id_value_1, shareto_id_1) (cv_id_value_2, user_id_value_2, shareto_id_2)`

, только один запрос на пакетную вставку

0 голосов
/ 01 ноября 2019

Убедитесь, что цикл форматирует данные в массив, как показано ниже

$data = array(
    array('cv_id'=> 2, 'user_id'=> 1, 'shareto_id'=> 4),
    array('cv_id'=> 5, 'user_id'=> 3, 'shareto_id'=> 9),
    //...
);

Model::insert($data);

Так что в вашем случае код должен выглядеть следующим образом

$data = [];
for($i=0; $i<$cvlength; $i++)
{
  for($j=0; $j<$sharetolength; $j++)
  {
     $data[] = [
         'cv_id' => $cv_id[$i],
         'user_id' => $request->user_id,
         'shareto_id'=> $shareto_id[$j]
     ];
  }
}    
Share::insert($data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...