環境
Laravel v9.5.1 (PHP v8.1.3)
状況
deleteする際エラーが発生。
Method delete does not exist.
public function destory($id)
{
$article = Article::where('id', $id)->get();
$article->delete();
return redirect()->route('home');
}
原因
Article::where('id', $id)->get();
の返り値がCollectionクラスだから。
Collectionクラスに対してdeleteできないというエラーだった。
(Collectionクラスは、RailsでいうEnumerableモジュールだと思う)
>>> Article::where('id', 9)->get();
=> Illuminate\Database\Eloquent\Collection {#4467
all: [
App\Models\Article {#4461
id: 9,
user_id: 1,
title: "title",
content: "content",
created_at: null,
updated_at: null,
},
],
}
解決法
public function destory($id)
{
$article = Article::where('id', $id)->first();
//OR
$article = Article::find($id);
$article->delete();
return redirect()->route('home');
}
get / first / findの返り値の違い
get() → Eloquent Collectionクラス
first() → modelオブジェクト
find() → modelオブジェクト
Eloquent Collection
クラス:Illuminate\Database\Eloquent\Collection
のインスタンス
>>> Article::where('id', 9)->first();
=> App\Models\Article {#4460
id: 9,
user_id: 1,
title: "title",
content: "content",
created_at: null,
updated_at: null,
}
>>> Article::find(9);
=> App\Models\Article {#4477
id: 9,
user_id: 1,
title: "title",
content: "content",
created_at: null,
updated_at: null,
}
最適解
ただ、deleteする際の取得の仕方としてよりベターなのはfindOrFail
を使う。
findOrFail
で取得したいarticle
が見つからなかったときはエラーを吐いてくれる。
(Railsでは、@article.find(id)
だけでエラー吐いてくれる)
public function destory($id)
{
$article = Article::findOrFail($id);
$article->delete();
return redirect()->route('home');
}
参考