第28回 Laravelでデータの一覧表示、登録、変更、削除

公開日:2021-05-17 更新日:2021-05-17

1. 概要

Laravelでデータの一覧表示、登録、変更、削除をする方法について説明しています。

2. 動画



3. ルーティング

routes/web.php に以下を追加。
Route::resource('articles', 'App\Http\Controllers\ArticleController');

4. モデル

app/Models/Article.php
<?php
namespace App\Models;

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

class Article extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'body'];
}

5. コントローラー

app/Http/Controllers/ArticleController.php
<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Article;

class ArticleController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $articles = Article::all();
        return view("article.index", ['articles' => $articles]);
    }

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

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $article = new Article($request->input('article'));
        $article->save();

    	return redirect()->route('articles.index')->with('message', '作成しました。');
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show(Article $article)
    {
        return view("article.show", [
            'article' => $article,
        ]);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $article = Article::find($id);
        return view("article.edit", [
            'article' => $article,
        ]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $article = Article::find($id);
        $article->fill($request->input('article'));
        $article->save();

        return redirect()->route('articles.index')->with('message', '更新しました。');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $article = Article::find($id);
        $article->delete();

        return redirect()->route('articles.index')->with('message', '削除しました。');
    }
}

6. ビュー・登録画面

src/resources/views/article/create.blade.php
デザインに関する部分は省略してあります。
@extends('layouts.app')
@section('content')
	<form action="{{ route('articles.store') }}" method="post">
	    @csrf
	    <input type="text" name="article[title]" /><br /><br />
	    <input type="text" name="article[body]"  /><br /><br />
	    <input type="submit" class="btn btn-info text-white" value="登録" />
	    <a class="btn btn-info text-white ml-5" href="{{ route('articles.index') }}">一覧に戻る</a>
	</form>
@endsection

7. ビュー・編集画面

src/resources/views/article/edit.blade.php
デザインに関する部分は省略してあります。
@extends('layouts.app')
@section('content')
	<form action="{{ route('articles.update', [$article->id]) }}" method="post">
	    @csrf
	    @method('put')
	    <input type="text" name="article[title]" value="{{ $article->title }}" /><br /><br />
	    <input type="text" name="article[body]"  value="{{ $article->body  }}" /><br /><br />
	    <input type="submit" class="btn btn-info text-white" value="登録" />
	    <a class="btn btn-info text-white ml-5" href="{{ route('articles.index') }}">一覧に戻る</a>
	</form>
@endsection

8. ビュー・一覧画面

src/resources/views/article/index.blade.php
デザインに関する部分は省略してあります。
@extends('layouts.app')
@section('content')
	<ul>
	    @foreach ($articles as $article)
	        <li><a href="{{ route('articles.show',[ $article->id ]) }}">{{ $article->title }}</a></li>
	    @endforeach
	</ul>
	<a class="btn btn-info text-white" href="{{ route('articles.create') }}">追加</a>  
@endsection

9. ビュー・詳細画面

src/resources/views/article/show.blade.php
デザインに関する部分は省略してあります。
@extends('layouts.app')
@section('content')
	{{ $article->id }}:{{ $article->title }}<br />
	<hr />
	{{ $article->body }}<br />
	<br />
	<a class="btn btn-info text-white" href="{{ route('articles.edit', [$article->id]) }}">編集</a>
	
	<form class="d-inline" action="{{ route('articles.destroy', [$article->id]) }}" method="post">
	    @csrf
	    @method('delete')
	    <input type="submit" class="btn btn-info text-white" value="削除" />
	</form>
@endsection