LaravelでCRUDを実装してみる

サーバーを起動

Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-8.3"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder ".", "/vagrant", type:"virtualbox"

  config.vm.provision "shell", inline: <<-SHELL
    dnf install -y git zip unzip

    # MariaDBのインストール
    dnf install -y mariadb-server
    systemctl enable --now mariadb

    # PHPのインストール
    dnf install -y php php-json php-mbstring php-xml php-zip php-pdo php-mysqlnd

    # Composerのインストール
    curl -sS https://getcomposer.org/installer | php
    mv composer.phar /usr/local/bin/composer
  SHELL
end
> vagrant up
> vagrant ssh

プロジェクトを作成

プロジェクトを作成。

$ cd /vagrant
$ composer create-project laravel/laravel hoge --prefer-dist
$ cd hoge

起動は下記のコマンドで行う。

$ php artisan serve --host 0.0.0.0

f:id:yk5656:20210206163535j:plain

テーブルの準備

とりあえず、データベースを作っておく。

$ mysql -u root -e 'CREATE DATABASE laravel'

モデルとマイグレーションファイルの作成。

$ php artisan make:model Book --migration

マイグレーションファイルを修正し、

$ vi database/migrations/2021_XX_XX_XXXXXX_create_books_table.php
・・・
    public function up()
    {
        Schema::create('books', function (Blueprint $table) {
            $table->id();
            $table->string('name', 100);
            $table->integer('price');
            $table->timestamps();
        });
    }
・・・

マイグレーションを実行。

$ php artisan migrate

シーダーのファイルを作成し、

$ php artisan make:seeder BooksTableSeeder

初期データを記述し、

$ vi database/seeds/BooksTableSeeder.php
・・・
    public function run()
    {
        DB::table('books')->insert([
            ['name' => 'aaa', 'price' => 100],
            ['name' => 'bbb', 'price' => 200],
            ['name' => 'ccc', 'price' => 300],
        ]);
    }
・・・

投入。

$ php artisan db:seed --class=BooksTableSeeder

データが入った。

$ mysql -u root laravel -e 'SELECT * FROM books'
+----+------+-------+------------+------------+
| id | name | price | created_at | updated_at |
+----+------+-------+------------+------------+
|  1 | aaa  |   100 | NULL       | NULL       |
|  2 | bbb  |   200 | NULL       | NULL       |
|  3 | ccc  |   300 | NULL       | NULL       |
+----+------+-------+------------+------------+

ルーティングとコントローラーの作成

Bookコントローラを作成し、

$ php artisan make:controller BookController --resource

ルートを追加。

$ vi routes/web.php
・・・
Route::resource('book', 'BookController');

下記のようなルートになっている。

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

コントローラーに「use App\Book;」を追加しておく。

$ vi app/Http/Controllers/BookController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Book;
・・・

レイアウトの作成

レイアウトを作成。

$ mkdir resources/views/layouts
$ vi resources/views/layouts/app.blade.php
<html>
  <head>
    <title>@yield('title')</title>
  </head>
  <body>
    <h1>@yield('title')</h1>
    <div>
      @yield('content')
    </div>
  </body>
</html>

Read(読み取り)

一覧

コントローラーを下記のように修正し、

$ vi app/Http/Controllers/BookController.php
・・・
    public function index()
    {
        $books = Book::all();
        return view('book.index', compact('books'));
    }
・・・

ビューを作成。

$ mkdir resources/views/book
$ vi resources/views/book/index.blade.php
@extends('layouts.app')

@section('title', '一覧画面')
@section('content')
<table border="1">
  <tr>
    <th>名前</th>
    <th>値段</th>
  </tr>
  @foreach ($books as $book)
  <tr>
    <td>{{ $book->name }}</td>
    <td>{{ $book->price }}</td>
  </tr>
  @endforeach
</table>
@endsection

これで、一覧画面が表示できる。 f:id:yk5656:20210206163601j:plain

詳細

コントローラーのshowを下記のように修正し、

$ vi app/Http/Controllers/BookController.php
・・・
    public function show($id)
    {
        $book = Book::find($id);
        return view('book.show', compact('book'));
    }
・・・

indexビューにshowへのリンクを追加し、

$ vi resources/views/book/index.blade.php
・・・
  <tr>
    <th>名前</th>
    <th>値段</th>
    <th>操作</th>
  </tr>
  @foreach ($books as $book)
  <tr>
    <td>{{ $book->name }}</td>
    <td>{{ $book->price }}</td>
    <td>
      <a href="{{ route('book.show',$book->id)}}">詳細</a>
    </td>
  </tr>
  @endforeach
・・・

showのビューを作成。

$ vi resources/views/book/show.blade.php
@extends('layouts.app')

@section('title', '詳細画面')
@section('content')
<table border="1">
  <tr>
    <th>ID</th>
    <td>{{ $book->id }}</td>
  </tr>
  <tr>
    <th>名前</th>
    <td>{{ $book->name }}</td>
  </tr>
  <tr>
    <th>値段</th>
    <td>{{ $book->price }}</td>
  </tr>
  <tr>
    <th>作成日時</th>
    <td>{{ $book->created_at }}</td>
  </tr>
  <tr>
    <th>更新日時</th>
    <td>{{ $book->updated_at }}</td>
  </tr>
</table>
@endsection

一覧画面に詳細画面へのリンクが追加され、 f:id:yk5656:20210206163615j:plain

クリックすると、詳細画面が表示される。 f:id:yk5656:20210206163634j:plain

残り

下記の記事が参考になる。

Laravel CRUDを実装する
https://noumenon-th.net/programming/2020/01/30/laravel-crud/