質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

Undefined variable 変数を定義したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 174

score 20

やりたいこと

未定義エラーについて、どの箇所を修正すれば良いか分かり兼ねるためご教示いただければと思います。

エラー画面

イメージ説明

試したこと

レイアウトとして「app.blade.php」を全てのビューに紐付けており、他のビューではエラーが生じないのですが、editビューでは上記エラーが発生します。コントローラーのupdateアクションの部分かと思い、「$employee」→「$employees」などに修正しますが変わりないものです。

■web.php

Route::get('guest', 'Auth\LoginController@guestLogin')->name('login.guest');
Route::get('/', 'EmployeesController@index');

Route::get('/employee.search', 'EmployeesController@search')->name('employee.search');

Auth::routes();

Route::group(['middleware' => 'auth'], function () {
    Route::resource('index', 'EmployeesController', ['only' => ['index']]);
    Route::resource('employee_create', 'EmployeesController');
});

■Employee.php(モデル)

namespace App;
use IlluminateSupportFacadesDB;
use Illuminate\Database\Eloquent\Model;

class Employee extends Model
{

    protected $fillable = ['id','emlpoyee_id','employee_name','office','employee_image'];

    protected $guarded = array('id');

    public function goods()
    {
        return $this->hasMany(Goods::class);
    }
}

■EmployeesController.php(コントローラー)※一部省略

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Employee;
use App\Goods;
use Illuminate\Support\Facades\Storage;

class EmployeesController extends Controller

{
    public function index()
    {
        $employees = Employee::with('goods')->paginate(10);
        return view('index', ['employees' => $employees,
        ]);
    }
    public function show($id)
    {
        $employee = Employee::find($id);
        return view('employee_show', compact('employee'));
    }

    public function edit($id)
    {
        $employee = Employee::find($id);
        return view('employee_edit', compact('employee'));
    }

    public function update(Request $request, $id)
    {
        $employee = Employee::find($id);
        $employee->office = $request->office;
        $employee->employee_image = $request->employee_image;
        $employee->save();

        $goods = $employee->goods()->latest()->first();
        $goods->uniform = $request->uniform;
        $goods->winter_clothes = $request->winter_clothes;
        $goods->shoes = $request->shoes;
        $goods->other = $request->other;
        $goods->memo = $request->memo;
        $goods->save();

        return redirect(route('employee_create.index'))->with('flash_message','社員情報を更新しました');
    }

    public function search(Request $request)
    {
        $employee = Employee::where('employee_name', 'like', "%{$request->search}%")
                            ->orWhere('office', 'like', "%{$request->search}%")
                            ->paginate(3);

        $search_result = $request->search.'の検索結果は'.$employee->total().'件です';

        return view('index', [
                    'employees' => $employee,
                    'search_result' => $search_result,
                    'search_query' => $request->search
                    ]);
    }
}

■app.blade.php(ビュー)※一部省略

 <body>
    @include('commons.header')

    <!-- search -->
    @isset($search_result)
        <h5 style="padding: 15px;">{{ $search_result }}</h5>
    @endisset

    @if(isset($employee_name))
        {{ $employees->appends(['employee_name' => $employee_name])->links() }}
    @elseif(isset($office))
        {{ $employees->appends(['office' => $office])->links() }}
    @endif

    @include('commons.footer')
 </body>

■employee_edit.blade.php(ビュー)※一部省略

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="login-container">
    <h3>{{ $employee->employee_name }}({{ $employee->employee_id }})</h3>
        <div class="card-body">
            <form method="POST" action="{{ route('employee_create.update', $employee->id) }}"> 
                @csrf
                @method('PATCH')

                <div class="form-group row">
                    <label class="col-md-4 col-form-label text-md-right">所属</label>
                        <div class="col-md-6">
                            <select name="office" class="form-control">
                                <option value='disabled' style='display:none'></option>
                                @foreach(['1営業所', '2営業所', '3営業所'] as $office)
                                    <option
                                        @if ($employee->office === $office)
                                            selected
                                        @endif
                                    >{{ $office }}</option>
                                @endforeach
                            </select>
                        </div>
                </div>
                @foreach($employee->goods as $goods)
                <div class="form-group row">
                    <label class="col-md-4 col-form-label text-md-right">制服</label>
                        <div class="col-md-6">
                            <select name="uniform" class="form-control">
                                <option value='disabled' style='display:none'></option>
                                @foreach(['S', 'M', 'L', 'XL'] as $size)
                                    <option
                                        @if ($goods->uniform === $size)
                                            selected
                                        @endif
                                    >{{ $size }}</option>
                                @endforeach
                            </select>
                        </div>
                </div>
                <div class="form-group row">
                    <label class="col-md-4 col-form-label text-md-right">防寒着</label>
                        <div class="col-md-6">
                            <select name="winter_clothes" class="form-control">
                                <option value='disabled' style='display:none'></option>
                                @foreach(['S', 'M', 'L', 'XL'] as $size)
                                    <option
                                        @if ($goods->winter_clothes === $size)
                                            selected
                                        @endif
                                    >{{ $size }}</option>
                                @endforeach
                            </select>
                        </div>
                </div>
                <div class="form-group row">
                    <label class="col-md-4 col-form-label text-md-right">靴</label>
                        <div class="col-md-6">
                            <select name="shoes" class="form-control">
                                <option value='disabled' style='display:none'></option>
                                @foreach(['23㎝', '23.5㎝', '24㎝', '24.5㎝', '25㎝', '25.5㎝', '26㎝', '26.5㎝', '27㎝', '27.5㎝', '28㎝', '28.5㎝'] as $size)
                                    <option
                                        @if ($goods->shoes === $size)
                                            selected
                                        @endif
                                    >{{ $size }}</option>
                                @endforeach
                            </select>
                        </div>
                </div>
                <div class="form-group row">
                    <label class="col-md-4 col-form-label text-md-right">その他</label>
                        <div class="col-md-6">
                            <input type="text" name="other" class="form-control" value="{{ $goods->other }}" placeholder="その他を入力してください">
                        </div>
                </div>
                <div class="form-group row">
                    <label class="col-md-4 col-form-label text-md-right">メモ</label>
                        <div class="col-md-6">
                            <input type="text" name="memo" class="form-control" value="{{ $goods->memo }}" placeholder="メモを入力してください">
                        </div>
                </div>
                @endforeach

                <div class="form-group row mb-0">
                    <div class="col-md-8 offset-md-4">
                        <input type="submit" value="社員情報を更新する" class="btn btn-primary">
                        <input type="reset" value="戻る" class="btn btn-secondary" onclick='window.history.back(-1);'>
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>
@endsection
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

showも動いてないんじゃないですかね。compact関数の使い方が問題に見えます。

各引数について、compact() は現在のシンボルテーブルにおいてその名前を有する変数を探し、 変数名がキー、変数の値がそのキーに関する値となるように追加します。 端的に言うと、extract() の逆の動作をします。
PHP: compact - Manual

つまり下のような配列が生成され、viewに渡されている。

compact('employee') => ["employee" => $employee]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/08/11 17:40 編集

    muteki_gamer様
    コメントいただきありがとうございます。
    compact関数について改めて公式ドキュメントを確認しました。

    showについては動作画面表示されておりました。こちらの変数は「$employee」としているため、compact('employee')で動いております。

    editについては「$employee」としているため、エラーの通りapp.blade.phpにて、「$employees」となっている箇所を「$employee」に修正したところ解決しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る