Поиск значений по ключам в многомерном массиве и сохранение их в базе данных - PullRequest
1 голос
/ 25 марта 2020

У меня есть массив, который является многомерным или вложенным, я не уверен насчет правильного слова. Дело в том, что я пытаюсь найти указанный ключ c, вернуть его значение и сохранить его в своей базе данных за одну итерацию. Это то, что я пытался, но создает много строк в моей базе данных, когда мне просто нужно 1.

  $arr = $json['confirmed_by_province'];

    foreach ($arr as $province) {
        $confirmedByStates = new ConfirmedByProvinces();
        foreach ($province as $key => $value) {
            if($key == 'ON') {
                $confirmedByProvinces->ontario = $value;
            }
            if($key == 'QB') {
                $confirmedByProvinces->quebec = $value;
            }
            $confirmedByProvinces->save();
        }
    };

Вот данные по переменной $ arr:

 array:31 [
  0 => array:1 [
    "ON" => "60"
  ]
  1 => array:1 [
    "QB" => "46"
  ]

Ответы [ 3 ]

2 голосов
/ 25 марта 2020

Проблема связана с вашей l oop, если мы действительно остановимся и посмотрим, что происходит, это будет иметь гораздо больший смысл:

foreach ($arr as $province) {
    $confirmedByStates = new ConfirmedByProvinces();
    foreach ($province as $key => $value) {
        if($key == 'ON') {
            $confirmedByProvinces->ontario = $value;
        }
        if($key == 'QB') {
            $confirmedByProvinces->quebec = $value;
        }
        $confirmedByProvinces->save();
    }
};

Для каждой итерации вы обновляете новую модель с именем ConfirmedByProvinces:

foreach ($arr as $province) {
    $confirmedByStates = new ConfirmedByProvinces();
//...

В конце каждой итерации вы затем вызываете save():

foreach ($arr as $province) {
//...
    $confirmedByProvinces->save();

Как вы теперь можете видеть, каждая итерация внешнего l oop создаст новый экземпляр вашей ConfirmedByProvinces модели, а затем сохранит его во внутренней l oop, в результате чего будет получено несколько строк для столько записей, сколько имеется в вашем массиве.

@ ответ DilipHirapara решит вашу проблему, но я подумал, что более подробное объяснение прояснит, почему это было проблемой с самого начала.

2 голосов
/ 25 марта 2020

использовать $confirmedByProvinces->save(); метод вне массива $province.

     foreach ($arr as $province) {
        $confirmedByStates = new ConfirmedByProvinces();
        foreach ($province as $key => $value) {
            if($key == 'ON') {
                $confirmedByProvinces->ontario = $value;
            }
            if($key == 'QB') {
                $confirmedByProvinces->quebec = $value;
            }

        }
        $confirmedByProvinces->save();
    };
0 голосов
/ 26 марта 2020

Избегайте столько, сколько в ваших мощных действиях БД в foreach l oop. В этом случае вы можете установить все значения из l oop в массив и сохранить их в БД в одном запросе:

$insert = [];
foreach ($arr as $k => $province) {
    foreach ($province as $key => $value) {
        if ($key == 'ON') {
            $insert[$k]['ontario'] = $value;
        }
        if ($key == 'QB') {
            $insert[$k]['quebec'] = $value;
        }
    }
    // add timestamps here if needed since insert() method doesn't make that automatically
    // $insert[$k]['created_at'] = \Carbon\Carbon::now();
    // $insert[$k]['updated_at'] = \Carbon\Carbon::now();
}

if (!empty($insert)) {
    $confirmedByStates = new ConfirmedByProvinces();
    $confirmedByStates->insert($insert); // one I/O with DB
}
...