Self-Curation

新卒社会人で営業マンになりました

Laravle#4 簡単な投稿フォームの作成(DBとの連携)

f:id:scuration:20200802232227p:plain

前回は投稿フォームを作成して表示させました。

ただしデータベースとの接続が行われていないので、投稿データを保存することができません。

今回はmigrateとmodelファイルの作成によって送信したデータを投稿フォームに反映してみましょう。



データベースを使用するために必要なこと

フォームから送信した内容を保存する場合はデータベースとの連携が必要になります。
大まかに以下の手順を踏むことで送信されたフォームデータをデータベースに反映可能です。
(※XAMPP+Laravelで環境構築している場合)

①DBにアクセスするための設定ファイルを編集(env、database.php
②任意の名前でmigrationファイルの作成
③migrationファイルに任意のフィールドを追記(デフォルトではIDとタイムスタンプしか記述されていない)
④migrateコマンドでmigrationファイルに記述されたテーブル・カラムをMySQLに反映
⑤Modelファイルを作成し、投稿フォームに表示するフィールドを追記
⑥View、Controller、routingの作成

今回の実行環境

XAMPP
PHP:7.4.8
・DB:mariaDB(myphpadmin:5.0.2)
Apache:2.4.43
Laravel Framework 7.21.0

DBへのアクセス設を確認

php composer.phar create-project laravel/laravel SampleProject --prefer-dist

初回の記事で、上記コマンドでLaravelプロジェクトを作成したと思います。


XAMPPで環境構築した場合、myphpadminの設定を変えていなければ初期設定で問題ないと思います。
(問題ないというのはDBへmigrateとデータ保存が行えるという意味で)

ただ初期設定はパスワードが設定されていません。
今後変更した際にはLaravel側の下記ファイルを参照し、データベースのログイン情報を編集してください。
App\.env
App\config\database.php

migration関連

migrationファイル作成

C:\PHP\Sample>php artisan make:migration create_posts_table --create=posts
Created Migration: 2020_07_25_091011_create_posts_table

上記コマンドを叩いてマイグレーションファイルを作成します。
今回はpostsという名前でテーブルを作成しました。

migrationファイルをDBに反映


1回migrateを行ってmyphpadmin(mariaDB)に反映できるか試してみましょう。
後からカラムを追加したい場合の手順は後述します。


\appに作成された202X_0X_XX_XXXXXXX_create_posts_table.phpを開くと以下のように記述されているでしょう。

public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }


デフォルトではIDとタイムスタンプのカラムのみ記述されています。
このままmigrateするとidtimestampのカラムが含まれたテーブルがMySQL上に作成されます。

C:\PHP\Sample>php artisan migrate
Migrating: 202X_0X_XX_XXXXXXX_create_posts_table
Migrated:  202X_0X_XX_XXXXXXX_create_posts_table(0.1 seconds)

↓実行後のmyphpadmin
f:id:scuration:20200725222033p:plain

migrationファイルにカラムを追加

先ほどidとtimestampしかカラムがない状態でmigrateを行いました。
ここで目的に沿った任意のカラムを追加してみましょう。


database\migrationsフォルダのmigrationファイル、20XX_XX_XX_XXXXXX_create_posts_table.phpを開いて編集します。

    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
       //追記
            $table->string('name', 50);
            $table->text('comment', 300);
        });
    }


デフォルトではidとtimestampしかカラムが存在しませんので、upの方に任意のカラムを追加して保存します。
今回はnamecommentのカラムを追加しました。


紛らわしいのですが$table->データ型('カラム名', 文字数);という形式で入力してください。
でないとmigrateしたときに以下のようなエラーが出ます。
私はidとtimestampの書き方まねたら、しばらくエラーから抜け出せませんでした。。。

>$ php artisan migrate
Migrating: 2020_07_25_131403_create_posts_table
   BadMethodCallException
  Method Illuminate\Database\Schema\Blueprint::name does not exist.


**migrateによるDBへの転記

新規作成したテーブルにカラムを追加するときは手順が変わります。

>|terminal|
C:\PHP\Sample>php artisan migrate
Nothing to migrate.

1度でもmigrateしてDBにテーブルを作成しても、次migrateしたときに差分を読み取ってくれるわけではありません。

php artisan migrate:rollback

一応ロールバックすることも可能ですが作成前に戻るため、テーブル自体が消滅してしまいます。

そこで今度は--createでなく--tableオプションを使用します。
>terminal||
php artisan make:migration create_posts_table_2 --table=posts
|


最初に作ったものと同じファイル名を指定すると重複エラーが出るので注意してください。
逆にカラムをDBから削除したい場合は以下のようにdownへ書き込んでmigrateします。

public function down()
    {
        Schema::dropIfExists('posts');
             $table->dropColumn('comment');
    }

Model作成と編集

C:\PHP\Sample>php artisan make:model Post
Model created successfully.

前回modelを作成していない場合は上記コマンドで作成。
作成したmodelはプロジェクト名\appフォルダに配置されています。

今回だとPost.phpを開き以下のようにデータベースのフィールドを追加します。

class Post extends Model
{
    //追記
    protected $fillable = [
        'name',
        'comment',
    ];
}

Controllerの編集

前回作成したNewpostController.phpを編集します。

作成していない場合は下記コマンドを叩いてください。
作成している場合は内容編集だけで構いません。

php artisan make:controller NewpostController

app/Http/ContollersフォルダにNewpostController.phpが作成されるので編集します。

use Illuminate\Http\Request;
use App\Post; //追記
use Illuminate\Support\Facades\DB; //追記

class NewpostController extends Controller
{
    //
     public function Sample() {
        return view('sample');
     }

      
     public function create(Request $request) {

        // 投稿内容の受け取って変数に入れる
        $name = $request->input('name');
        $comment = $request->input('comment');
    
        post::insert(["name" => $name,"comment" => $comment]);
     }
}

一旦上記のように記述しました。
特にDBファサード(クエリ操作に必要)とモデルをuseの記述によって継承するのを忘れないでください。
example.com/sampleを開くとviewファイルに記述された投稿フォームが表示されます。
投稿フォームの送信を押すと各フィールドの内容が変数として送信されます。

routing設定

前回の記事で投稿フォームを表示するところまではルーティング設定しております。
今回は送信ボタンを押した際のルーティングを追記します。

app\routes\web.phpを開き以下のように追加してください。

//投稿フォーム表示
Route::get('/sample', 'NewPostController@newpost');
//POSTメソッドの処理
Route::post('/sample', 'NewpostController@create');

これで送信ボタンを押した際にNewpostControllerのcreateにアクセスして処理を行います。

実際にフォームから送信

php artisan serveでローカルサーバーを立ち上げ、http://127.0.0.1:8000/sampleを開くと以下のようにフォームが表示されるはずです。

f:id:scuration:20200726001934p:plain

入力して送信して成功すると真っ白の画面になるはずです(今回は遷移先の設定をしていないので)。

myphpadminからpostテーブルを確認してみるとこのようにデータが追加されていました!

f:id:scuration:20200726002332p:plain