バリデーション nullや空値を許容する

requiredの反対にnullableというnullや空値を許容するバリデーションルールが存在する。
日付型(date)のバリデーションは単独で用いると必須になるため、空を許容するならnullableも一緒に用いると良い。

    public function store(Request $request){

        $request->validate([
            'sales_amt' => 'required|numeric',
            'billing_date' => 'nullable|date',
            
        ]);
        
        $sales = new Sales();
        $sales->sales_amt = $request->sales_amt;
        $sales->status = $request->status;
        $sales->billing_date = $request->billing_date ?? null;

        $sales->save();
        
        return redirect('/sales');
        
    }
	

バリデーション

コントローラ


	public function store(Request $request){

	    $request->validate([
	        'sales_amt' => 'required|numeric', // 必須且つ、数値であること
	        'billing_date' => 'nullable|date', // 空を許容且つ、日付形式であること
	    ],[
	        'sales_amt.required' => '販売額は必須ですよ',
	        'sales_amt.numeric' => '販売額は数字で入力してね。',
	        'billing_date.billing_date' => 'うーん。日付じゃないね',
	    ]);
	

○○.blade.php


	<!-- バリデーションエラーの表示 -->
	@if ($errors->any())
	    <div class="alert alert-danger">
	        <ul>
	            @foreach ($errors->all() as $error)
	                <li>{{ $error }}</li>
	            @endforeach
	        </ul>
	    </div>
	@endif
	
	<form method="POST" action="{{ url('test/update') }}">
		@csrf
		<input name="sales_amt" type="text"  class="form-control" placeholder="売上額" value="{{old('sales_amt', $ent->sales_amt)}}">
		<input name="billing_date" type="date"  class="form-control" placeholder="請求日" value="{{old('billing_date', $ent->billing_date)}}" >
	

requestからパラメータを取得 | GETとPOSTからパラメータ取得

class TestController{
	public function index(Request $request){
		$client_name => $request->client_name, // 顧客名
	

リクエストのパラメータをすべて取得

class TestController{
	public function index(Request $request){
		$params = $request->all();
	

セッションからの読込、および書き込み | SESSION

session(['test_key' => $testData]); // セッションにデータを書き込む
$testData = session('test_key');// セッションからデータを読取り
session()->forget('test_key'); // セッションから削除
下記の方法は誤りなので注意
session('test_key' ,$testData); // 誤ったやりかた

Laravel, bladeにおけるURLパスの記述方法 | url('/') asset('/')

○○.blade.phpでリンクであるURLを記述するにはurl()またはasset()を用いる。自動的にルートパスが付加されるので便利。
asset()とurl()の違いは末尾に「/」が付くか付かないかである。 asset()は末尾に「/」が付くが、url()は末尾に「/」が付かない。

記述例
 
	<a href="{{ url('animal/bark') }}">吠える</a>
	<a href="{{ asset('animal/bark') }}">吠える2</a>
	

blade 配列にキーに紐づく値が空、もしくは未セットであるときの代替表示 {{ ($errs['j_name_err'] ?? 'ぬー') }}


	<div>{{ ($errs['animal_name'] ?? '') }}</div>
	

bladeの@foreach


@foreach ($items as $ent)
<tr data-item-id='{{$ent['item_id']}}'>
	<td>インデックス:<span>$loop->index</span></td>
	<td>{{$ent['name']}}</td>
	<td>{{$ent['value']}}</td>
</tr>
@endforeach
	

INSERTとUPDATEを自動判別してDB登録 | updateOrInsert | save

updateOrInsertメソッドはモデルクラスのメソッド。
idの有無でUPDATEとINSERTを自動判別してDB保存できる。
updateOrInsertは複数行のDB登録はできない。1行づつである。

updateOrCreateメソッドとの違い updateOrCreateとupdateOrInsertは名前も役割もよく似ている。
違いとしてupdateOrCreateはテーブル名が指定できない。モデルに紐づいているテーブルで固定されている。
updateOrInsertはテーブル名の指定が可能。


        // 基本的記述方法 id=12に該当するレコードがあればUPDATE、なければINSERTになる。第一引数と第二引数はマージされる。
        $res = DB::table("clients")->updateOrInsert(
                ['id'=>12], 
                ['client_name' => 'クバガサ製造株式会社テスト10']
        );
        dump($res);// 正常時はtrueが返ってくるのみ。

        // idをnullにするとINSERTになる。
        $res = DB::table("clients")->updateOrInsert(
                ['id'=>null], [
                'client_name' => 'クバガサ製造株式会社テスト11',
        ]);

        // 新規追加 第一引数を省略するとINSERTになる。
        $res = DB::table("clients")->updateOrInsert(
                'client_name' => 'クバガサ製造株式会社テスト11',
        ]);


        //トランザクションにも対応
        DB::beginTransaction();
        
        $res = DB::table("clients")->updateOrInsert(
                ['id'=>null], 
                ['client_name' => 'クバガサ製造株式会社テスト12',]
                );
        $res = DB::table("clients")->updateOrInsert(
                ['id'=>null],
                ['client_name' => 'クバガサ製造株式会社テスト13',]
                );
        
        DB::commit();
        // DB::rollback();
        
        
        //INSERTしたレコードのidを取得する方法。 
        DB::beginTransaction();
        
        $res = DB::table("clients")->updateOrInsert(
                ['id'=>null], 
                ['client_name' => 'クバガサ製造株式会社テスト12',]
                );
        $res = DB::getPdo()->lastInsertId(); // INSERTしたレコードのidを取得する。UPDATEの場合は0が取得されるので注意
        dump($res);
        
        DB::commit();
        // DB::rollback(); // ロールバックしてもINSERTしたレコードのidは取得される。idは内部でインクリメントされているらしく、次にINSERTを試みるとidは+2になっている。
        
        
        id = DB::getPdo()->lastInsertId();

誤り:間違えやすいパターン



        //誤りパターン1。 一度に複数のレコードが登録できるわけではない。情報もないため複数行に恐らく対応していない。そもそも第一引数と第二引数にはそれぞれ意味がある
        $res = DB::table("clients")->updateOrInsert(
                ['client_name' => 'クバガサ製造株式会社テスト4'],
                ['client_name' => 'クバガサ製造株式会社テスト5',]
        );

        //誤りパターン2。エンティティ内にidフィールドを含めただけではUPDATEにならない。  id=12のレコードがあってもUPDATEにならずINSERTになる。
        $res = DB::table("clients")->updateOrInsert(
                ['id'=>12,'client_name' => 'クバガサ製造株式会社テスト5',]
        );

        // 誤りパターン3。よく似た機能であるupdateOrCreateメソッドではエラーになる。updateOrCreateはテーブル指定までできないようだ。
        $res = DB::table("clients")->updateOrCreate(
                ['id'=>null], 
                ['client_name' => 'クバガサ製造株式会社テスト12',]
                );

DB: クエリビルダで取得したデータにさらに別のフィールドを追加する | getData | select, get

DBから取得したデータに「cat_master」フィールドを追加する例

    $data = ¥DB::table('nekos')
        ->limit(5)->get();

    foreach($data as $ent){
        $ent->cat_master = 'ネコマスター';
    }