kad
@kad (Yuta)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

laravelにて、DBに値が保存されない

Q&A

Closed

ralavel初心者です。
自作で情報共有アプリを作成しています。
フォームに値を入れて、新規投稿ボタンを押すとエラーが出てしまいます。

フォーム

Image from Gyazo

エラー

Image from Gyazo

コントローラーにて変数を定義してると思いますので、なぜエラーが出るのかが分かりません。
分かる方居ましたらお願い致します。

コントローラー

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Sauna;

class SaunaController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('saunas.sauna');
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('saunas.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {

        $sauna = new Sauna;

        $sauna->$shop = $request->input('shop');
        $sauna->$sauna = $request->input('sauna');
        $sauna->$ice = $request->input('ice');
        $sauna->$chill = $request->input('chill');
        $sauna->$article = $request->input('article');

        $sauna->save();

        return redirect('sauna');

        // dd($shop, $sauna);
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

ビュー

@extends('layouts.app')

@section('content')
<!DOCTYPE html>
<html lang="ja"> 
<head> 
  <meta charset="UTF-8"> 
  <link rel="stylesheet" href="public/css/content.css">
</head> 
<body>
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-12">
              <div class="card-body">
                  @if (session('status'))
                      <div class="alert alert-success" role="alert">
                          {{ session('status') }}
                      </div>
                  @endif
              </div>
            </div>
            <div class="card" style="width: 35rem;">
              <div class="card text-center">
                <div class="card-body"> 
                <p>サウナ新規投稿</p>
                <form method="POST" action="{{route('store')}}">
                  @csrf
                    <div class="pt-3">
                      <div class="form-group">
                        <label>店名</label>
                        <textarea class="form-control" name="shop" rows="5"></textarea>
                      </div>
                    </div>
                    <div class="pt-3">
                      <div class="form-group">
                          <label>サウナ</label>
                          <textarea class="form-control" name="sauna" rows="5"></textarea>
                      </div>
                    </div>
                    <div class="pt-3">
                      <div class="form-group">
                          <label>水風呂</label>
                          <textarea class="form-control" name="ice" rows="5"></textarea>
                      </div>
                    </div>
                    <div class="pt-3">
                      <div class="form-group">
                          <label>外気浴</label>
                          <textarea class="form-control" name="chill" rows="5"></textarea>
                      </div>
                    </div>
                    <div class="pt-3">
                      <div class="form-group">
                          <label>その他</label>
                          <textarea class="form-control" name="article" rows="5"></textarea>
                      </div>
                    </div>
                    <div class="pt-3">
                      <div class="row center-block text-center">
                          <div class="col-6">
                              <button type="button" class="btn btn-outline-secondary btn-block">戻る</button>
                          </div>
                          <div class="col-6">
                              <input class="btn-info" type="submit" value="新規投稿">
                          </div>
                      </div>
                    </div>
                  </form>
                  </div>
                </div>
            </div>  
        </div>
    </div>
</body>
</html>
@endsection
<!-- <img src="iStock-1163221036.jpg" class="img-fluid" alt="..."> -->

モデル

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Sauna extends Model
{
    use HasFactory;
}

データベース

Image from Gyazo

0

2Answer

エラーメッセージの通り変数$shopは定義されていません。

$sauna->XXXの記述の仕方に問題があります。通常、プロパティへのアクセスにあたってプロパティ名に$は不要です。

クラスのメソッドからstatic でないプロパティにアクセスするには -> (オブジェクト演算子) を使って $this->property のようにします (property のところにプロパティ名を指定します)。

変数$shopを定義しつつSaunaモデルのshopフィールドに代入するのであれば次のようになります。

SaunaControllerの42行
-        $sauna->$shop = $request->input('shop');
+        $shop = $request->input('shop');
+        $sauna->shop = $shop;

変数$shopが必要なければ1行で次のようにします。

SaunaControllerの42行
-        $sauna->$shop = $request->input('shop');
+        $sauna->shop = $request->input('shop');

通常ではないケースとして、プロパティ名の部分を変数にして動的にアクセスすることができます。

class Hoge {
    public $a;
}

$hoge = new Hoge();
$field = 'a';
$hoge->$field = 'hello wolrd';

echo $hoge->a; // hello wolrd

2Like

解説までいただきありがとうございます!
$取り除いたら保存できました。

0Like

Your answer might help someone💌