やりたかったこと
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]
自分のメモ用なのでわかりづらいと思いますが参考にしてください。