LoginSignup
3
4

More than 3 years have passed since last update.

Laravel 5.8 CRUD

Posted at

初期でログイン認証にも使えるusers/password_resetsのテーブル定義が用意されている
./database/migrations/

まずは上記のテーブル定義をDBに追加する。

テーブル作成

テーブル定義ファイルの生成

$ php artisan make:migration create_profiles_table

./database/migrations/配下にテンプレートが作成される

Laravel 5.8 データべース:マイグレーション

作成したテーブル定義をDBに反映させる

$ php artisan migrate
$ php artisan migrate:refresh # 再度登録するがレコードは削除される

初期値がある場合

管理ユーザーとか、導入時必ず必要なデータや
ダミーデータなどを入れて操作を確認するためにseederが用意されている。

$ php artisan make:seeder UsersTableSeeder  #新規作成

./database/seeds/配下にUsersTableSeeder.phpが生成される
run()内にDBへ投入するレコードを記載する。

UsersTableSeeder.php
public function run()
{
    $now = new DateTimeImmutable();
    DB::table('users')->insert([
        'name' => 'hogehoge.admin',
        'email' => 'admin@example.com',
        'password' => bcrypt('password'),
        'email_verified_at' => $now,
        'created_at' => $now,
        'updated_at' => $now,
    ]);
}

./database/seeds/DatabaseSeeder.phpに以下の記載を追加する

DatabaseSeeder.php
public function run()
{
    $this->call([
        UsersTableSeeder::class,
        # ほかにもシーダーテーブルがあれば記載
    ]);
}

以下のコマンドで投入

$ php artisan migrate --seed

モデル定義

Usersに関しては初期状態で既に作成済のため不要

$ php artisan make:model モデル名(単数形)

./app配下に生成される

認可、認証機能を導入する際に変更するがとりあえず未編集のまま。

コントロールを作る

以下のコマンドでモデルに対するControllerを作成する

commnad.
$ php artisan make:controller UserController --resource

--resourceがないと空のクラス。
--resourceをつけるとCRUDに必要なメソッド一式をlaravel側で導入してくれる。
Laravel 5.8 コントローラ

ルーティングの設定

routes/web.php
Route::resource('users', 'UserController');

ルーティングの確認は以下のコマンドで行う

$ php artisan route:list
+--------+-----------+-------------------+---------------+---------------------------------------------+--------------+
| Domain | Method    | URI               | Name          | Action                                      | Middleware   |
+--------+-----------+-------------------+---------------+---------------------------------------------+--------------+
|        | GET|HEAD  | /                 |               | Closure                                     | web          |
|        | GET|HEAD  | api/user          |               | Closure                                     | api,auth:api |
|        | GET|HEAD  | users             | users.index   | App\Http\Controllers\UserController@index   | web          |
|        | POST      | users             | users.store   | App\Http\Controllers\UserController@store   | web          |
|        | GET|HEAD  | users/create      | users.create  | App\Http\Controllers\UserController@create  | web          |
|        | GET|HEAD  | users/{user}      | users.show    | App\Http\Controllers\UserController@show    | web          |
|        | PUT|PATCH | users/{user}      | users.update  | App\Http\Controllers\UserController@update  | web          |
|        | DELETE    | users/{user}      | users.destroy | App\Http\Controllers\UserController@destroy | web          |
|        | GET|HEAD  | users/{user}/edit | users.edit    | App\Http\Controllers\UserController@edit    | web          |
+--------+-----------+-------------------+---------------+---------------------------------------------+--------------+

コントローラの各アクションを実装する。

users.index

コントロール実装

UserControler.phpにモデルの宣言を追加

app/Http/Controllers/UserController.php
user Illuminate\Http\Request;
use App\User; # モデル定義
()
public function index()
{
    $users = User::all();
    return view('users.index', ['users' => $users]);
}

ビュー実装

laravelはHTMLテンプレートにBladeを採用している
Laravel 5.8 Bladeテンプレート
とりあえずwelcom.blade.phpからコピーしてbody部だけ編集。
後々content部分とヘッダーフッター部を分離する。
以上部に新規追加用にAddボタン追加

resources/views/users/index.blade.php
(略)
<a href={
<div class="table-responsive">
    <table class="table table-striped">
        <thead><tr><th>{{ __('ID') }}</th><th>{{ __('Name') }}</th></tr></thead>
        <tbody>
            @foreach($users as $user)
            <tr>
                <td>{{ $user->id }}</td>
                <td>{{ $user->name }}</td>
            </tr>
            @endforeach
        </tbody>
    </table>
</div>

https://hoge/users/にアクセスするとユーザー一覧(IDとName)が表示される

users.show

次に名前を選択したら各人のページに遷移するように変更。
index.blade.phpの名前をaタグにリンクを'/users/{id}'とする。

resources/views/users/index.blade.php
(略)
<div class="table-responsive">
    <table class="table table-striped">
        <thead><tr><th>{{ __('ID') }}</th><th>{{ __('Name') }}</th></tr></thead>
        <tbody>
            @foreach($users as $user)
            <tr>
                <td>{{ $user->id }}</td>
                <td><a href="{{ url('users/'.$user->id) }}">{{ $user->name }}</a></td>
            </tr>
            @endforeach
        </tbody>
    </table>
</div>

コントローラを実装

モデルがEloquentモデルとして作成してある場合、
$idではなく$モデル名でもよい

app/Http/Controllers/UserController.php
()
//public function show($id)
public function show(User $user)
{
// $idの場合はfind()で取得
//    $user = User::find($id);
    return view('users.show', ['user' => $user]);
}

viewの実装。編集モードに遷移するためのEditボタン付与

resources/views/users/show.blade.php
(略)
    <div class="container">
        <div class="row">
            <div class="col-sm-2">{{ __('ID') }}</div>
            <div class="col-sm-10">{{ $user->id }}</div>
            <div class="col-sm-2">{{ __('Name') }}</div>
            <div class="col-sm-10">{{ $user->name }}</div>
            <div class="col-sm-2">{{ __('E-Mail Address') }}</div>
            <div class="col-sm-10">{{ $user->email }}</div>
            <div class="col-sm-10 offset-sm-2">
                <a href="{{ url('users/'.$user->id.'/edit') }}" class="btn btn-primary">{{ __('Edit') }}</a>
                <a href="#" class="btn btn-danger">{{ __('Delete') }}</a></div>
        </div>
    </div>

users.create/users.store

ユーザーの新規追加処理。
/users/createで画面表示。画面内にForm作成。
formのアクションに/users/storeを指定する。

コントローラ

app/Http/Controllers/UserController.php
()
public function create()
{
    return view('users.edit'); // 表示はeditと同じにする。
}
public function store(Request $request)
{
    $user = new User;
    $user->name = $request->name;
    $user->email = $request->email;
    $user->password = $request->password;
    $user->save();
    // 新規登録されたidでshow画面にリダイレクトする
    return redirect('users/'.$user->id);
}

ビュー

edit.blade.phpと同じになるようにする。
editかcreateの違いは$userがあるか否か

resources/views/users/edit.blade.php
(略)
    <div class="container">
        <div class="row">
@isset($user)
            <form action="{{ url('users/'.$user->id) }}" method="post">
                @method('PUT')
@else
            <form action="{{ url('users') }}" method="post">
                @method('POST')
@endisset
                <div class="form-row">
                    <div class="form-group col-sm-12">
                        <label for="name">{{ __('Name') }}</label>
                        <input type="text" class="form-control" id="name" name="name" value="{{ old('name', isset($user) ? $user->name : '') }}" placeholder="{{ __('Name') }}">
                    </div>
                </div>
                <div class="form-row">
                    <div class="form-group col-sm-6">
                        <label for="email">{{ __('E-Mail Address') }}</label>
                        <input type="email" class="form-control" id="email" name="email" value="{{ old('email', isset($user) ? $user->email : '') }}" placeholder="{{ __('E-Mail Address') }}">
                    </div>
{{-- passwordは新規のみ --}}
@if(!isset($user))
                    <div class="form-group col-sm-6">
                        <label for="password">{{ __('Password') }}</label>
                        <input type="password" class="form-control" id="password" name="password" value="{{ old('password', isset($user) ? $user->password : '') }}" placeholder="{{ __('Password') }}">
                    </div>
@endif
                </div>
                <button type="submit" name="submit" class="btn btn-primary">{{ __('Submit') }}</a>
            </form>
        </div>
    </div>

users.edit/users.update

ユーザーの更新処理

コントロール

app/Http/Controllers/UserController.php
()
public function edit(User $user)
{
    return view('users.edit', ['user' => $user]); // 表示はeditと同じにする。
}
public function update(Request $request, User $user)
{
    $user->name = $request->name;
    $user->save();
    return redirect('users/'.$user->id);
}

ビュー

createで作成したものを使用

users.destory

ユーザーの削除処理

コントロール

app/Http/Controllers/UserController.php
()
public function destory(User $user)
{
    $user->delete();
    return redirect('users');
}

ビュー

show.balde.phpの削除ボタンを実装

resources/views/users/show.blade.php
(略)
    <div class="container">
        <div class="row">
            <div class="col-sm-2">{{ __('ID') }}</div>
            <div class="col-sm-10">{{ $user->id }}</div>
            <div class="col-sm-2">{{ __('Name') }}</div>
            <div class="col-sm-10">{{ $user->name }}</div>
            <div class="col-sm-2">{{ __('E-Mail Address') }}</div>
            <div class="col-sm-10">{{ $user->email }}</div>
            <div class="col-sm-10 offset-sm-2">
                <a href="{{ url('users/'.$user->id.'/edit') }}" class="btn btn-primary">{{ __('Edit') }}</a>
                <form action="{{ url('users/'. $user->id) }}" method="post" style="display:inline;">
                    @csrf
                    @metod('DELETE')
                    <button type="submit" name="submit" class="btn btn-danger">{{ __('Delete') }}</button>
                </form>
            </div>
        </div>
    </div>

これだと誰でも編集できるのでログイン認証を導入する。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4