ウェブログラム ~学習するな実践せよ~

作成日: 2018-11-17

DBと接続してモデルの使い方を学ぼう

前回までは、ルーティング、コントローラ、ビューについて学びました。 最後の砦であるデータを扱うモデルを学んでいきましょう。

ここを学ぶことで、Laravelの基礎はある程度抑えられるようになります。 もっと詳細なウェブアプリの作り方は、実践編として作成していきますので、そちらで学んでいきましょう。

環境

  • PHP7.2.5
  • Laravel5.6
  • CentOS7

対象読者

  • Laravelの環境構築が完了している
  • フレームワーク超初心者
  • ルーティングとコントローラとビューの基礎を理解している
  • MySQLのインストールが完了している(分からない場合は環境構築編を参照)

モデルの位置づけとしては、データを扱うところとなります。 モデル=データという風に今は思ってもらって大丈夫です。

DBと接続し、確認を行う

まずはLaravelとMySQLで作成するDBとを接続し、ちゃんと接続出来たか確認をしていきましょう。

DBを作成

MySQLに接続して、Laravelアプリケーションで使うDBを作成しましょう。

mysql -u root -pAsdf1234!

私のMySQLのrootユーザのパスワードは「Asdf1234!」に設定しているので、「-p」以降にパスワードを指定して上げればログインできます。 -pの後ろにスペースを開けると弾かれるので注意してください。

次のコマンドでLaravelアプリケーション用のDBを作成します

create database webrogram_db

こで「webrogram_db」という名前のDBが出来上がりました。

Laravelの環境変数にDBの接続情報を記述

Laravelにはアプリケーションのディレクトリ直下に「.env」と呼ばれる、環境変数(アプリケーションで使ういろいろな情報)を記述するファイルがあります。

最初は「.env.example」というファイルしかないと思うので、これをコピーして「.env」を作成しましょう。

cp .env.example .env

.envの中身を編集していきましょう。 以下のような行がありますが、これを

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret


↓のように書き換えましょう

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=webrogram_db #データベース名
DB_USERNAME=root #データベースに接続するユーザ名
DB_PASSWORD=Asdf1234! #データベースに接続するユーザのパスワード


最初の環境構築編で、DBに接続するパスワード等を設定しましたが、 それを記述します。 今はrootでwebrogram_dbに接続していますが、これは良い方法ではありません。 本当はDB毎にユーザを作成し、そのユーザのパスワードを設定し、それらの情報を「.env」に記述するというのが良い方法です。 例えば、「webrogram_db」というDBに接続できるユーザ「webrogram」を作成し、「webrogram」ユーザのパスワードを「webrogram1234!」とかに設定する。

この辺はまた、ウェブアプリ制作編できちんと設定していきます。

LaravelからDBへの接続確認方法

DBへの接続設定は終わったので、本当に接続できるようになっているのか、確認をしていきましょう。

おもむろに以下のコマンドをコマンドライン上で実行しましょう。実行する場所はLaravelアプリケーションのディレクトリ直下です。

php artisan migrate

そして、以下のような表示されるとOKです。

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table


これは何をしているかと言うと

/database/migrations/2014_10_12_000000_create_users_table.php

このようなファイルが最初からアプリケーション内にあるのですが、 ここには「こういうテーブルを作成しなさい」という記述がされています。

つまり、php artisan migrateと打つと、/database/migrations/以下にあるマイグレーションファイルというファイルが読み込まれ、 DBにテーブルを作成してくれています。

このとき「.env」に記述したDBの接続情報が間違っていると、エラーになります。

では本当にテーブルが作成されたのか見ましょう。

MySQLにログインして

mysql -u root -pAsdf1234!

使用するDBを選択して

use webrogram_db

DB内のテーブル一覧を見ます

show tables;

以下のようにテーブルが作成されていればOKです。

+------------------------+
| Tables_in_webrogram_db |
+------------------------+
| migrations |
| password_resets |
| users |
+------------------------+

これでDBの接続確認は終わりです。

Userモデルを触ってみる

先程のマイグレーションファイルにより、usersというテーブルが作成されました。 このusersテーブルから、レコードを表示したり、新しく追加したりなどの操作を行っていきましょう。

このUserモデルについては、最初からマイグレーションファイルにも記述されていますし、Userモデルのファイルでもある、 /app/User.phpというファイルがあります。 このUser.phpというファイルに記述されているUserクラスをモデルと思っておいてください。

コントローラからUserモデルを呼び出す

まずはコントローラで先程のUserモデルを呼出してみましょう。

ルーティングは今以下のように設定していますので、

// ユーザ一覧
Route::get('/users', 'UserController@index');

UserControllerのindexアクションに記述していけば良さそうです。

app/Http/Controllers/UserController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User; // ユーザモデルを使用すると指定①

class UserController extends Controller
{
public function index(Request $req)
{
dd(User::all()); // ユーザ一覧を取得②
return view('users.index', $data);
}
//以下省略

では詳しく見ていきましょう。 ①ではUserクラスを使用すため、useをしています。これで、UserControllerの中でUserクラスを使用することができるようになります。 ②のUser::all()という記述で、usersテーブルから全レコードを取得しています。 つまり登録されているユーザがすべて取れるということですね。 この記述をしたときは以下のようのなSQLが発行されます。

select * from users;

またdd()については、Laravelで使えるvar_dumpやdumpのようなもので、引数内を表示し、exitしてくれるので、記述したところまでで処理とまります。 結構多用するので覚えておきましょう。

ではブラウザにアクセスしてみましょう。

http://192.168.33.10:8000/users

ここで表示されている、CollectionやitemsというのはLaravel固有のものなので、「そういう表示がされるんだ〜」くらいに思っておいてください。 itemsの中が空になっているということは、usersテーブルに1件もレコードが存在しないということです。

では、レコードを作成してあげましょう。 MySQLにログインして、レコードをインサートします。

その前に、本当にレコードがないか見ます。

mysql> select * from users;
Empty set (0.00 sec)

0件ですね

ではインサートします。

insert into users(name,email,password) values("takeshi","takeshi@webrogram.com","takeshi1234!");

ブラウザにアクセスします。

次は何やら1件値があるようです。開いていきましょう。

先程insertした「takeshi」が表示されていますね。 これでレコードの取得は完了です。

ユーザを登録

次はUserモデルを使って、ユーザの登録を行いましょう。 実はめちゃくちゃ簡単で、

 public function index(Request $req)
{
// ユーザ登録
User::create([
'name' => "minamino",
'email' => "minamino@webrogram.com",
'password' => "minamino9876!",
]);
// ユーザ一覧取得
dd(User::all());
return view('users.index', $data);
}

これだけです。 ブラウザにアクセスすることで ユーザ登録 ↓ ユーザ一覧取得 ということになります。これで2件に増えていれば成功です。

ちゃんと2件になっていますね。

内容を見てみると、minaminoさんが登録されていますね。

ですが今、ブラウザにアクセスする度に「minamino」が登録されていきます。 もう一度アクセスしてみましょう。

おや?なぜエラーになるのでしょう? 実はこれ、emailが「すでに登録されているものと重複していますよ」と怒られているんです。 usersテーブルのemailカラムにはユニーク成約という、同じ値は2つ登録できない決まりをマイグレーションファイルで設定しているからなんです。

このユニーク成約をテーブルから外して行くと、minaminoさんはアクセスの度無限に増え続けます。怖いですね。

実際は登録の処理などは、アクセスするだけのGET通信などでは行わず、 ビュー表示で扱った、フォームによるPOST通信などで登録していきます。 このあたりの話は実践編で、細かくルーティングやアクションを分けて習得していきましょう(まだ未作成)。

ビューで表示する

UserControllerを以下のように修正してください。

 public function index(Request $req)
{
// ユーザ登録
$data['users'] = User::all();
return view('users.index', $data);
}

これでusersとしてビューに渡され、表示してくれます。

ですが、このままではレコードの中身すべてを表示しているので、不要な情報が沢山表示されていますね。 パスワードなんて表示してしまったら、地獄でしかないです(普通は暗号化するので大丈夫ですが)。

ビュー側で以下のように記述すると、直感的かつ簡単に必要な情報だけを表示することが出来ます。

/resources/views/users/index.blade.php
<!doctype html>
<html lang="ja">
<head>
</head>
<body>
<ul>
@foreach($users as $user)
<li>{{ $user->name }} | {{ $user->email }}</li>
@endforeach
</ul>
</body>
</html>

$user->nameという風にすることで、ユーザテーブルのnameカラムを取得するという処理になります。 どうですか、とても簡単でしょう!

Laravelではこれまで説明したモデルについて、Eloquentモデル(エロクエントモデル)と呼んでいます。

レコードの一覧取得や登録、更新、削除、特定条件での取得など、Laravelでは簡単に操作できる仕組みを提供しています。 いろいろcreateやall以外にも沢山メソッドがあるので、見てみてください。 今後の実践編やウェブアプリ制作編で沢山使って行くので、そこで学んで慣れていきましょう。

LaravelなどのWebアプリケーションフレームハークはとにかく慣れが重要です。慣れることですばやく柔軟にウェブアプリが制作できるようになります。 いろんな操作を実践して、スキルアップを目指してください!

作成日: 2018-11-17