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

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

ただいまの
回答率

88.77%

Laravelでのエラー、”Attribute [department] does not exist”の解決方法について。

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,500

pei123

score 10

前提・実現したいこと

Laravel初心者です。現在Laravelを使ってコードを書いています。
web.phpをいじっていたらエラーが発生しました。
どのように解決すればいいのか御指南いただけないでしょうか?
宜しくお願い致します。

発生している問題・エラーメッセージ

InvalidArgumentException
Attribute [department] does not exist.

該当のソースコード

web.php
<?php
Route::patch('/departments/{department}', 'DepartmentsController@update');

Route::delete('/departments/{department}', 'DepartmentsController@destroy');

Route::department('/departments/{department}', 'CommentsController@store');
Route::delete('/departments/{department}/comments/{comment}', 'CommentsController@destroy');
Route::patch('/departments/{department}', 'DepartmentsController@update');
Route::department('/departments', 'DepartmentsController@store');
Route::get('/departments/{department}/edit', 'DepartmentsController@edit');
Route::get('/departments/create', 'DepartmentsController@create');
// });

Route::get('/', 'DepartmentsController@index');
// Route::get('/Departments/{id}', 'DepartmentsController@show');
Route::get('/departments/{department}', 'DepartmentsController@show')->where("department", "[0-9]+");

Route::get('/contacts', 'ContactsController@index');
// Route::get('/Contacts/{id}', 'ContactsController@show');
Route::get('/Contacts/{contact}', 'ContactsController@show');
DepartmentsController.php
<?php

namespace App\Http\Controllers;
use Auth;
use Illuminate\Http\Request;
use App\Department;
use App\Image;
use App\Http\Requests\DepartmentRequest;
use Illuminate\Http\UploadedFile;
use Symfony\Component\HttpFoundation\File\UploadedFile as SymfonyUploadedFile;

class DepartmentsController extends Controller
{
public function index() {
// $departments = \App\Department::all();
// $departments = Department::all();
// $departments = Department::orderBy('created_at', 'desc')->get();
$departments = Department::latest()->get();
// $departments = [];
// dd($departments->toArray()); // dump die
// return view('departments.index', ['departments' => $departments]);
return view('departments.index')->with('departments', $departments);
}

// public function show($id) {
public function show(Department $department) { 
// $department = Department::find($id);
// $department = Department::findOrFail($id);
// dump($department);

$department->load(['comments', 'mainImage']);
//         dd($department);
return view('departments.show')->with('department', $department);
}

public function create() {
return view('departments.create');
}

public function store(DepartmentRequest $request) {
$department = new Department();
$department->title = $request->title;
$department->body = $request->body;
$department->user_id = Auth::id();

$department->save();
$this->updateImage($request, $department);
return redirect('/');
}

public function edit(Department $department) {
return view('departments.edit')->with('department', $department);
}

private function updateImage($request, $department)
{
if ($request->hasFile('main_image_filename')) {
if (!empty($image)) {
// imageの差し替え
$image->delete();
}
$image = new Image;
$image->storeDepartment($request->main_image_filename);
}

if (!empty($image)) {
$image->alt = $request->get('image_alt');
$image->department_id = $department->id;
$image->save();
$department->main_image_id = $image->id;
$department->save();
}
}

public function update(DepartmentRequest $request, Department $department) {
$department->title = $request->title;
$department->body = $request->body;
$department->user_id = Auth::id();
$department->save();
$this->updateImage($request, $department);
return redirect('/');
}
public function destroy(Department $department) {
$department->delete();
return redirect('/');
}

}

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

Route::department('/departments/{department}', 'CommentsController@store');

これが原因です。
ルートのメソッドにRoute::departmentなんてものはなく、使用できるのは次の6つです。

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

https://laravel.com/docs/5.7/routing#basic-routing

解決方法としては、
Controllerのメソッド名がstoreなのでRoute::postだとは思いますが、そこは要件に合わせてRoute::departmentを上記のどれかに変更してください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

Route::get('/departments/{department}', 'DepartmentsController@show')->where("department", "[0-9]+");


でshow()が受け取るのは整数であるはずです。

一方で、関数の定義では

public function show(Department $department) {

とモデル(ですよね?)を受け取るようになっている、という齟齬があります。

ここは整数を受け取るようにし、そのIDでモデルを検索する、とすべきかと思います。

public function show($department) {
  $dep = Department::find($department);


つまり現在コメントアウトされている方が正しいと思われます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/26 08:08

    む、Route::department 見つけられなかった…
    xenbeatさんのおっしゃる通りかと思います。。。

    キャンセル

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

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

関連した質問

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