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
テーブルの準備
とりあえず、データベースを作っておく。
$ 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
これで、一覧画面が表示できる。
詳細
コントローラーの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
一覧画面に詳細画面へのリンクが追加され、
クリックすると、詳細画面が表示される。
残り
下記の記事が参考になる。
Laravel CRUDを実装する
https://noumenon-th.net/programming/2020/01/30/laravel-crud/