1
2

More than 3 years have passed since last update.

2つの配列を1つのforeach処理でDBに格納する方法

Last updated at Posted at 2021-08-01

やりたかったこと

WordテーブルとNoteテーブルのカラムにformから送られてきた値を格納。

Noteテーブルのカラム
・user_id
・title

Wordテーブルのカラム
・note_id
・question 
・answer

create.blade.php

<form action="{{route('Vocabularys.add')}}" method="POST">
    @csrf
    <div>
        <h3>タイトル</h3>
        <input type="text" name='title'>
    </div>
    <div>
     //name = 'question'だと最後の1個のデータしか渡せないがname='question[]'とすることで配列にして全部の値をコントローラーに渡すことができる
        <p>Q.<input type="text" name='question[]'></p>
        <p>A.<input type="text" name='answer[]'></p>
        <p>Q.<input type="text" name='question[]'></p>
        <p>A.<input type="text" name='answer[]'></p>
        <p>Q.<input type="text" name='question[]'></p>
        <p>A.<input type="text" name='answer[]'></p>
        <a href="">削除</a>
    </div>
    <div>
        <p>
            <a href="">追加</a>
        </p>
        <p class="create-btn">
            <input type="submit" value="登録">
        </p>
    </div>
</form>

contoroller

public function add(Request $request){
     //ログインしているユーザーのIDを取得
        $userId = Auth::id();

        //モデル名::createを使うとモデルと接続されているテーブルにカラムが格納される
     //そのまま変数の中でcreateを行う。
        $note = Note::create([
            //上記でログインしているユーザーのID取得した$userIdをuser_idカラムに入れる。
            'user_id'=>$userId
            //formから送られたtitleをリクエストで呼び出しtitleカラムに格納
            'title'=>$request->title,
        ]);        

        // create.bladeから配列で受け取った値をそれぞれ変数に代入
        $questionItems = $request->question;
        $answerItems = $request->answer;

        // コールバック関数はないのでNull
        foreach (array_map(Null, $questionItems, $answerItems) as [$questionItem,$answerItem,]){

            $word = Word::create([
                'note_id'=> $note->id,
                'question' => $questionItem,
                'answer' => $answerItem,
            ]);
        };

        return redirect('/Vocabularys/index');
    }

上記でうまく2つの配列を1つのforeach処理でDBに格納できた。

最初やろうとしたこと

        // create.bladeから配列で受け取った値をそれぞれ変数に代入
        $questionItems = $request->question;
        $answerItems = $request->answer;

     //①の処理
        //$questionItemsの中の配列の値の分だけ回してWordテーブルに格納
        foreach ($questionItems as $item){
            $word = Word::create([
                'note_id'=> $note->id,
                'question' => $item,
            ]);
        };

        の処理
        //$answerItemsの中の配列の値の分だけ回してWordテーブルに格納
        foreach ($answerItems as $item){
            $word = Word::create([
                'answer' => $item,
            ]);
        };

実行すると
・①の処理でWordテーブルのanswerカラムがnullだよと怒られた。
同じ処理でquestionカラムとanswerカラムに値を入れないといけないだと!!え?どうしよう。
無知な僕はめちゃめちゃ悩んだ。ググるとarray_map関数に出会った。。

array_mapとは?
https://techacademy.jp/magazine/29657

これでできるんじゃね?
実装するといけた。
使い方合ってるか知らんけどwww

$配列1 = [1,2,3]

function コールバック関数名($n) {
    //$nには$配列1が入る。
    return $n + 1;
}

//hogeが呼ばれたら
$hoge = array_map(コールバック関数名, $配列1)

consol.log($hog);

+1される
[2,3,4]

自分のメモ用なのでわかりづらいと思いますが参考にしてください。

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2