laravel で blog アプリを作成。
仕様と手順は、以下の記事の通り。
今回は、3. アプリ作成の【7 Blog機能作成】の最初の部分を説明します。
今回の学習ポイントは次のとおり。
7. Blog機能作成
-
- 投稿モデルとマイグレーションファイルを作成
- 最初はファイル機能なしで作ってみる
- マイグレーション
- 表示テスト用に2つぐらい投稿のデータをDBで作っておく
- 投稿モデルとマイグレーションファイルを作成
手順7. Blog機能作成
手順 7.1 投稿モデルとマイグレーションファイル作成
Blog機能ですが、ひとつひとつの記事を投稿と呼んで、モデル名は、Post とします。
artisanコマンドでひな形を作成
まず、artisan で、ひな形を自動生成する機能がありますので利用しましょう。
コマンド入力できるツールを使います。僕は git bash を使ってます。
Windowsならコマンドプロンプト、Macならターミナルを使う人が多いかと思います。
artisan のモデル作成コマンドを一覧表示させる
プロジェクトのトップディレクトリにて php artisan make:model --help と入力して、artisan のモデル作成コマンドのヘルプを表示してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
user@GA401IH-R7G1650 MINGW64 /c/data/tk/work/myapp/blog2 (master) $ php artisan make:model --help Description: Create a new Eloquent model class Usage: make:model [options] [--] <name> Arguments: name The name of the class Options: -a, --all Generate a migration, seeder, factory, and resource controller for the model -c, --controller Create a new controller for the model -f, --factory Create a new factory for the model --force Create the class even if the model already exists <span style="color: #ff0000;"> -m, --migration Create a new migration file for the model</span> -s, --seed Create a new seeder file for the model -p, --pivot Indicates if the generated model should be a custom intermediate table model -r, --resource Indicates if the generated controller should be a resource controller --api Indicates if the generated controller should be an API controller -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question --env[=ENV] The environment the command should run under -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug |
すると、オプションに -m –migration があります。
-m か、–migration のオプションをつけると、マイグレーションファイルも作成してくれると書いてあります。今回はこれを使いましょう。
マイグレーションファイルを作成する
マイグレーションファイルは、データベースにテーブルを追加したり、テーブルを変更するためのファイルです。ちゃんと記述して、アプリケーションの変更とともに、データベースのテーブル構成も管理するために、とても便利です。
では、Postモデルと、データベースでのPostの保存先であるpostsテーブル作成のためのマイグレーションファイルを作成してみましょう。
php artisan make:model Post --migration と実行してください。
モデルの名前は単数形で書くのが慣例なのでPostと指定しています。
1 2 3 4 |
user@GA401IH-R7G1650 MINGW64 /c/data/tk/work/myapp/blog2 (master) $ php artisan make:model Post --migration Model created successfully. Created Migration: 2020_08_16_215215_create_posts_table |
上のように、モデルが作られましたという表示と、マイグレーションが作られましたと表示されたら成功です。
作成されたファイルの確認
この時自動生成されるファイルは以下の2つになります。
上がモデルファイル、下がマイグレーションファイルとなります。
モデルファイルについて
モデルファイル(Post.php)は、app の直下に作られます。
内容はこんな感じです。
すごくシンプルですが、これで、Postモデルを使って、データベースに投稿データを保管したり、逆に読み出したりすることができます。SQL言語を理解しなくてもデータベースにアクセスできるので、かなり便利ですよ。
マイグレーションファイルについて
もう一つのマイグレーションファイルは、databaseフォルダ/migrationsの中に作られます。
このファイルは、データベースのテーブルを作ったり、修正するのに使います。
中身を説明します。
up()関数の中に、これから作成するテーブルの設計図を書きます。
down()関数は、本アプリケーションのバージョンを戻す必要がある場合、データベースのテーブル構造も古いアプリケーション構造に戻す必要があるため、up() に書いてある内容を取り消す内容を書いておきます。
今回の場合、up() でテーブルを作成しているので、down() はテーブルを削除する命令が書いてあります。
dropIfExists()関数はテーブル削除する命令となります。
自動生成されたマイグレーションファイルの修正
今回、投稿を保存する Post モデルには、投稿者と、タイトル、本文 が必要なので、database / migrationsフォルダ内のマイグレーションファイルを以下のように修正します。
【修正前】
【修正後】
これでテーブルに3つのカラム(列)を追加したことになります。
それぞれ、次の用途で使います。
ユーザーID | $table->unsignedBigInteger(‘user_id’); |
タイトル | $table->string(‘title’); |
本文 | $table->text(‘body’); |
修正の根拠:マイグレーションのコマンドとmysqlデータ型について
なぜ「$table->unsignedBigInteger(‘user_id’);」のように入力するか、解説します。
公式マニュアルの「マイグレーション」にマイグレーションファイルに記述するコマンド(命令)について書いてあります。
このページを使っていきます。
*上記はLaravelのバージョン7.0のページとなります。
User モデルの id を user_id として記録したいので、users テーブルを作成した時のマイグレーションファイルの idを調べてみると、 $table->id() で作成されています。
公式マニュアルで $table->id() を確認すると、説明欄には「Alias of $table->bigIncrements(‘id’).」と書かれています。
これは、「別名は $table->bigIncrements(‘id’)」といった意味。
そこで「 $table->bigIncrements(‘id’)」を調べると「符号なしBIGINTを使用した自動増分ID(主キー)」とあります。
自動増分IDとは、勝手に増えていってしまうということ。
今回は自動増分なしにしたいので、もう少しマニュアルを探っていきます。
「符号なしBIGINT」でマニュアルに検索をかけると、次の項目にヒットしました。
そこで、この「$table->unsignedbigInteger() 関数」を使うことにします。
タイトルに使用したstring() と、本文に使用した text() も、このマニュアル内に書き方が書かれています。
どのデータ型にするべきか、テキストを保存できる形式はいっぱいあるので悩むかもしれません。
そういった場合は、そのテーブルのカラム(データ)が、どんなデータを入れるものかを考えてみましょう。
mysqlのデータ型
今回、mysql を使ってるので、mysqlでの型も調べてみます。
mysqlでいうと、VARCHARカラムとTEXTカラムでは、文字の最大数が65535バイトとなっており、同じっぽいです。
ただし、古いバージョンだったりデータベースの種類だったら違いがあったり、その関係で string()で指定するときのデフォルトサイズが255だったりします。
大きなサイズを指定するときには、$table->string(‘title’, 1000); のようにサイズも指定するようにしましょう。
下のリンクはMySQLのデータ型ごとのサイズ表です。
VARCHARは結構複雑な感じですね。
下記のように書かれており、65535バイトまで保管できることが分かります。
VARCHAR または VARBINARY カラムに格納できる有効な最大バイト数は最大行サイズ (65,535 バイト、すべてのカラムで共有される) によって決まります。
laravelではデータベースの文字コードは【utf8mb4】を使います。この文字コードでは日本語一文字につき4バイト使います。
つまり1万6千文字ぐらいまではVARCHAR、つまりマイグレーションのコマンドではstring()で保管できそうですね。
今回は、mysql で TEXTを示す text(‘body’)としましたが、VARCHARを使って $table->string(‘body’, 4096); ぐらいでもよいですね。
それ以上の大きなデータを保管するのであれば、MEDIUMTEXT、LONGTEXT を使用するってのでよさそうです。記事の原稿であれば、1万6千文字超えることもありそうなので。
このようにmysqlの文字数制限なども確認しつつ、マイグレーションのデータ型を指定しましょう。
7.2 マイグレーション
マイグレーションファイルができたら、実際にマイグレーションしましょう。
データベースにテーブルを作ったりテーブルを変更したりすることをマイグレーションと言います。
アプリケーションディレクトリで php artisan migrate と入力して実行します。
すると、下のようにマイグレーションして、終わったとの表示がされます。
1 2 3 4 |
user@GA401IH-R7G1650 MINGW64 /c/data/tk/work/myapp/blog2 (master) $ php artisan migrate Migrating: 2020_08_16_215215_create_posts_table Migrated: 2020_08_16_215215_create_posts_table (0.01 seconds) |
では、phpMyAdminで確認してみましょう。
左上の更新ボタンを押すと、テーブルリストに posts が表示されます。
クリックして、さらに、中央メニューの「構造」をクリックすると、カラムの一覧が表示されます。titleが varchar型で255文字、body がtext型で作成されているのがわかります。
7.3 表示テスト用に2つぐらい投稿のデータをDBで作っておく
最後にpostsテーブルにテストデータを作成しておきましょう。
phpMyAdminを使ったりmysqlのコマンドを使って直接入れることもできますが、artisan の tinker というLaravelのコマンドインターフェースからPostモデルを使ってデータの追加が可能です。今回は tinkerを使って作ってみましょう。
tinkerは英語で「小さな変更を加える」とか「いじくりまわす」といった意味があります。
まずは、アプリケーションのディレクトリで、
php artisan tinker
と入力してtinkerを起動します。
1 2 3 4 |
user@GA401IH-R7G1650 MINGW64 /c/data/tk/work/myapp/blog2 (master) $ php artisan tinker Psy Shell v0.10.4 (PHP 7.4.8 — cli) by Justin Hileman >>> |
laravelのコマンドインターフェース tinkerを使う
さて、tinkerからPostモデルを使って、記事を作ってみます。
Postモデルは、nameplace Appにあります。nameplace は、名前の衝突が起きないように、名前空間を分けて持つのでしたね。村のようなものです。例えば コントローラは、App\Http\Controllers 空間にありましたし、モデルは、App にあります。
まず、毎回、App\Post と入力するのが面倒なので、use を使います。
1 2 |
>>> use App\Post; >>> |
とくにエラー発生がないため、OKと判断します。
続けて、Post モデルのインスタンスを作ります。newコマンドを使ってます。
1 2 3 |
>>> $post = new Post; => App\Post {#4105} >>> |
$post にインスタンスが入ったので、user_id、title、bodyを設定していきます。
ほんとはtitleとかbodyの内容には日本語も入れられるのでですが、tinkerからコマンド入力するとき日本語が消えてしまうので、ここは英語で入力します。
下のリストの >>> の後に入力してあるのが コマンドです。
1 2 3 4 5 6 7 |
>>> $post->title = "second post" => "second post" >>> $post->body = "this is second post." => "this is second post. " >>> $post->user_id = 1 => 1 >>> |
ここで、
1 |
$post->user_id = 1; |
ですが、「この投稿(posts)は、user_id が 1 のユーザが作りました」ということを示します。
user テーブルにも id = 1 のユーザがいることが前提になりますのでご注意ください。ユーザがいない場合は、register(ユーザ登録)から作成しておいてください。逆に複数のユーザを作っていれば、user_id に1以外の値を入れて大丈夫です。
最後に保存します。 $post->save() とコマンドを実行すると、データベースに保存されます。
1 2 3 |
>>> $post->save(); => true >>> |
現在のデータベースに保存された投稿の一覧を見たいときは、 Post::all() というように、all()メソッドを使います。
これはPostモデルのデータでデータベースに保存されているものすべてを読みだしてくるコマンドです。変数に入れていないので、そのまま表示されます。
出力された表示は下のリストのようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
>>> Post::all() => Illuminate\Database\Eloquent\Collection {#4117 all: [ App\Post {#4119 id: 2, user_id: 1, title: "second post", body: "this is second post. ", created_at: "2020-08-17 16:17:03", updated_at: "2020-08-17 16:17:03", }, ], } >>> |
最後に quit で tinkerを終了します。
tinkerを使うと、モデルやクラスを気軽に使ってみたり、テストしたりすることができます。
まとめ
laravel 7 で Model作成と一緒にmigrationファイルを作って、マイグレーションをし、また、tinkerを使ってデータベースにデータを作成する手順を説明しました。
次から、投稿データを扱う部分を作成していきます。
===目次===
- laravelはPHPで動くフレームワーク ~laravel入門01~
- laravelでログイン機能付きサイトを作ってみよう、作成予定のWebアプリケーションの概要と作業手順の概略~laravel入門~
- 開発環境のインストール
- XAMPP
- VS code
- Git for Windows
- SourceTree
- laravelインストール
- composerインストール
- laravel本体インストール
- laravelのUIインストール
- node.jsインストール
- アプリ作成
- データベース設定
- ログイン機能追加
- npmインストール
- css, jsコンパイル
- Topページ作成
- Aboutページ作成
- 問い合わせページ作成
- Blog機能作成
- Model作成と一緒にmigrationファイルも作る。~Laravel7入門~
- リソース コントローラを自動生成して CRUD のうち一覧表示 indexアクションを実装する ~Laravel7入門~
- リソース コントローラで、詳細表示 showアクション を実装する ~Laravel7入門~
- リソースコントローラで新規作成:create, storeアクション を実装する~Laravel7入門~
- bladeテンプレートエンジンでタグを無視させつつ、改行を表示させる方法 ~Laravel7入門~
- リソースコントローラで更新:edit, updateアクション を実装する~Laravel7入門~
- リソースコントローラで削除:destroyアクション を実装する~Laravel7入門~
- 投稿にカバー画像を追加する ~Laravel7入門~
コメント