Laravle#4 簡単な投稿フォームの作成(DBとの連携)
前回は投稿フォームを作成して表示させました。
ただしデータベースとの接続が行われていないので、投稿データを保存することができません。
今回はmigrateとmodelファイルの作成によって送信したデータを投稿フォームに反映してみましょう。
【目次】
データベースを使用するために必要なこと
フォームから送信した内容を保存する場合はデータベースとの連携が必要になります。
大まかに以下の手順を踏むことで送信されたフォームデータをデータベースに反映可能です。
(※XAMPP+Laravelで環境構築している場合)
①DBにアクセスするための設定ファイルを編集(env、database.php)
②任意の名前でmigrationファイルの作成
③migrationファイルに任意のフィールドを追記(デフォルトではIDとタイムスタンプしか記述されていない)
④migrateコマンドでmigrationファイルに記述されたテーブル・カラムをMySQLに反映
⑤Modelファイルを作成し、投稿フォームに表示するフィールドを追記
⑥View、Controller、routingの作成
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するとidとtimestampのカラムが含まれたテーブルが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
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の方に任意のカラムを追加して保存します。
今回はname、commentのカラムを追加しました。
紛らわしいのですが$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を開くと以下のようにフォームが表示されるはずです。
入力して送信して成功すると真っ白の画面になるはずです(今回は遷移先の設定をしていないので)。
myphpadminからpostテーブルを確認してみるとこのようにデータが追加されていました!