説明することで知識をより深められる!同じミスを繰り返さない、ということでphpやlaravel、jsの今週の学びをメモ。変数名は実際のプログラムの中のものをそのまま使っている。
※アマチュアが書いています。初心者初心者と前置きするのは嫌だけど、参考にして違うじゃん!となるのも申し訳ないので一応。
条件式
if ($shipping == '1'){
...}
と書く。==で、比較して同じということになる。=は、代入。ド級の初歩的ミスだが全然気づかず。
選択肢の分岐(ビュー)
買い取りで入金方法を選択するような状況。口座振込、eメール式プリペイドカードの選択肢があるとする。
口座方法のラジオボタンにチェックを入れると銀行名とか、口座番号のフォームが出現し、プリペイドカードだと必要ない(会員登録時に登録されてるので)ので表示させないようにしたい。
これは、javascriptで解決する。最初にすべての選択肢を展開した状態のページを作成し、隠したい部分の属性?をhiddenにする。
http://5am.jp/javascript/form_change_javascript/
↑とても参考になった。ラジオボタンの状態をチェックして、切り替える。
このままだと最初の選択肢が未チェックのときの表示がおかしくなるので、既定チェックを用意しておき読み込み時に関数を実行するようにする。
必要なのがひとつだと
window.onload = 関数;
でいいが、複数登録は実行できない。ふつう選択肢はいくつかあるのでこれではなく、
window.addEventListener('load', function(){
関数();
});
window.addEventListener('load', function(){
関数();
});
として登録すればよい。 もちろんひとつの関数にまとめて入れてwindow.onloadでもOK。でもちょっと変?
DBの分岐(コントローラ)
選択肢の分岐と同じ状況。↑だけだと表示上はOKでもDBに格納するときに問題が発生する。最初に口座振込を選択して入力したあと、チェックを切り替えてプリペイドカード入金を選択すると余計なもの(必要ない口座情報)がpostされてしまう。このままDBに入れるとおかしなことになるので、格納に分岐が必要になる。
入金方法テーブル、銀行口座テーブルがあるとする。入金方法のidで分岐させる。
if ($request->paymentway_id == '1') {
$paymentBank_id = DB::table('paymentBanks')->insertGetId(
[
'entry_id'=>$entry_id,
'bank_id'=>$request->paymentbank_id,
]
);
}
となりあったリレーションだけ設定すれば辿れる(モデル)
laravelの入門書を読んだとき、モデルで矢印書くだけで入れた値が出てくる!ふむふむ、と思った。1つのリレーションはかんたんにできるようになったのだが、複数はどうするんだろう?という疑問が湧いた。少し検索すると、2つ先のリレーションはこうして書く、というのが出てきた。てっきりそうやってモデルごとにリレーションを書くものなのかとどこかで勘違いした。
3つ先や4つ先を書くことになったとき、どうすればいいんだろうと思って見直したりいじってみた。
モデルは数珠つなぎに辿っていくので、となりあって関連しているものだけ書けばいくつでもでも{{モデル->モデル->モデル->...}}としてアクセスできるということがわかった。専門の人には当たり前なのか、あまり説明がなかった。
複数insert(コントローラ)
複数の詳細データを一気にinsertしたいことはよくある。ProductID,commentは配列でpostされている。配列をばらして1つ1つに必要情報を格納、それをまた配列にしてそれをinsert。自分であまり理解していない。
foreach (array_map(null, $request->ProductID, $request->comment) as [$val1,$val2]) {
$param_comment [] = array(
'product_id' => $val1,
'comment' => $val2,
'customer_id' => $c_id,
'response_user_id' => $request->response_user_id,
'created_at' => now(),
);
}
DB::table('comments')->insert($param_comment);
今週の感想
1週間でけっこういろいろできるようになったなと。あと学んだことはちょこちょこメモっておいたので、思い出して書きやすかった。まだまだ先は長い…。