Allied ArchitectsAllied ArchitectsEngineer Blog

第一章3 『TodoモデルとLabelモデルの作成とマイグレーションとシーダーの作成』

2022/02/25 Laravel

TodoモデルとLabelモデルの作成と同時にファクトリーとマイグレーションとシーダーとコントローラーを作成

Generating Model Classes (モデルクラスの生成

以下のコマンドでモデルとマイグレーションとファクトリーとシーダーとコントローラーが一度に作れる。

 

todosテーブルとlabelsテーブルのマイグレーションの設定

Creating Tablesテーブルの生成

DB設計通りにカラム を追加していく。stringメソッドは第二引数で指定した長さのVARCHARカラム を作成してくれる。指定しないと255biteになる。

dateメソッドはDATEカラム を作成してくれる。期限に時間は使わないのでこれにした。

database/migrations/2022_02_25_000000_create_todos_table.php を以下のように書き換える。

 

Available Index Types利用可能なインデックスタイプ

ラベルのタイトルは一意のものにしたいのでuniqueメソッドを使用。

database/migrations/2022_02_25_000000_create_labels_table.phpを以下のように書き換える。

中間テーブルのマイグレーションの作成と設定

Generating Migrationsマイグレーションの生成

todosテーブルとlabelsテーブルを繋ぐ中間テーブルを作る。

ターミナルで以下を実行。

 

Foreign Key Constraints外部キー制約

todo_labelテーブルが繋いでいるtodoとlabelのデータのどちらかが消された時に中間テーブルのデータも消えて欲しいのでcascadeOnDeleteメソッドを使う。

database/migrations/2022_02_25_000000_create_todo_label_table.phpを以下のように書き換える。

 

マイグレーションの実行

Running Migrationsマイグレーションの実行

ターミナルで以下を実行する。

 

モデルの設定

Many To Many Relationships多対多リレーション

todoに紐付いているlabelを取得できるようにするためにbelongsToManyメソッドの結果を返すメソッドを作成する。

今回は「Eloquentは2つの関連するモデル名をアルファベット順に結合します。」とドキュメントに書いてあるのにtodo_labelというテーブル名を付けた(好み)のでbelongsToManyメソッドに第2、第3、第4引数を渡している。

app/Models/Todo.phpを以下のように書き換える。

 

labelに紐付いているtodoを取得することがあるかもしれないので同じようにメソッドを作成していく。

app/Models/Label.phpを以下のように書き換える。

ファクトリーの設定

Defining Model Factoriesモデルファクトリの定義

 

テスト用のタスクと期限を考えるのがめんどくさいのでfakerを使ってランダムデータを生成してくれるように設定。

database/factories/TodoFactory.phpを以下のように書き換える。

 

ラベルも同じ。

database/factories/LabelFactory.phpを以下のように書き換える。

 

リレーションが設定できているかのテスト

Creating Testsテストの作成

いろいろ追加したのでここらへんでテストしとく。

ターミナルで以下を実行。

 

Many To Many RelationshipsMany To Manyリレーション

phpunitのドキュメント

assertEquals

2 つの変数 $expected と $actual が等しくない場合にエラー $message を報告します。

と書かれているが、

assertSame

2 つの変数 $expected と $actual が同じ型・同じ値でない場合にエラー $message を報告します。

と書かれているので厳密な比較のassertSameを使う。

これはラベルを3つ持ったtodoを1つDBに登録し、そのtodoに紐づいているラベルの数をモデルで定義したメソッドを使って取ってきて数を比較している。

ラベルを3つ持ったtodoを作ったので3が返ってくると期待できるのでassertSameメソッドの第1引数には3を入れる。

その下は作成したtodoに紐付いているラベルに紐付いているtodoの数を取ってきて数を比較している。

今回3つのラベルに紐付いたtodoを1つ作成したので1が返ってくると期待できるのでassertSameメソッドの第1引数には1を入れる。

tests/Feature/ModelRelationTest.phpを以下のように書き換える。

 

Running Testsテストの実行

ターミナルで以下を実行。

こんな感じになればOK。

シーダーの設定

Illuminate\Support\DateFactory | Laravel API

Attaching / Detaching関連付け/関連解除

期限が前日と当日と次の日のtodoを3つずつ作成し、それぞれに3種類のラベルのうち1つをランダムで紐付ける。

database/seeders/TodoSeeder.phpを以下のように書き換える。

 

Inserting & Updating Modelsモデルの挿入と更新

Work、Study、Blogというタイトルのラベルを作成する。

database/seeders/LabelSeeder.phpを以下のように書き換える。

 

Calling Additional Seeders追加のシーダー呼び出し

ここで設定しないとartisanコマンド叩いても何も起きない。

database/seeders/DatabaseSeeder.phpを以下のように書き換える。

 

マイグレーションとシーダーの実行

Drop All Tables & Migrateすべてのテーブルを削除後にマイグレーション

テーブルを削除した後にマイグレーションを行い、ついでにシーダーも実行する。

ターミナルで以下を実行する。

れっちり
  • れっちり
  • 2021年新卒入社。letroの開発・運用業務を担当しています。

RELATION ENTRY

第一章11『子コンポーネントにプロパティを渡してグループ分けしたtodoを表示する』

第一章11『子コンポーネントにプロパティ...

2022/04/22 Vue.js

前回、todoを期限でグループ分けしたのでtodoGroupsの中のtodoにアクセスするためにはtodoGroups.within.today.todos[0]というようにする必要がある。また、todoGroups.within.todayまで到達したあとの処理は期限切れ、今日のもの、明日のもの、...

続きを読む

第一章10 『取得したtodoを期限でグループ分けする』

第一章10 『取得したtodoを期限でグ...

2022/04/18 Vue.js

取得した後に期限ごとにグループ分けをしたいので関数を追加する。 まず、getTodos関数によって取得したtodosはidの昇順になっているので、期限の日付で並び替えを行う。 以下の関数をmethodsに追加する。getTodos関数で取得してきたtodosをdataのtodos(以後this....

続きを読む

れっちりの記事一覧へ

ページTOPへ