phpMyAdminから手動でDLLなどを実行してテーブル定義することも可能ですが、各人が手動で実行する場合設定ミスなどが発生する可能性があります。なので、マイグレーションファイルという専用のファイルで変更情報をgit管理しておき、自動実行できるようにしておくことで設定ミスを防ぐことが可能になります。
テーブルの型の作成
1 |
php artisan make:migration create_モデルの複数形(users等)_table |
すると「database/migrations」の直下にファイルが生成されます。
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 30 31 |
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateTestsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('tests', function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('tests'); } } |
カラムタイプ
カラム修飾子 | 説明 |
---|---|
bigIncrements('名前') | 自動採番します。主キー等に付けて自動的に主キー選定されます。 |
string('名前',文字数) | 文字列を生成します。 |
longText('名前') | stringより長い文字数の数字を格納できます。 |
boolan('名前') | true/falseを格納できます。 |
tinyInteger('名前') | 少ない数字を格納できます。 |
timestamps() | 日時を格納できます。 |
primary() | 主キーをid以外等の他に設定したい場合や複合キーを設定したい場合等に使います。 |
カラム修飾子
下記のようにカラムタイプ(string)の先に指定できる修飾子です。
1 |
$table->string('名前',20)->nullable(); |
カラム修飾子 | 説明 |
---|---|
nullable() | NULLを許可します。 |
unsigned() | マイナスがないプラスだけの値を格納させます。 |
テーブルを作成する。
1 |
php artisan migrate |
実際に、上記で用意した型に基づいてテーブルを作成します。
カラムを追加する。
1 |
php artisan make:migration add_追加カラム名_to_テーブル名(users等)_table --table=テーブル名(users等) |
修飾子
修飾子 | 説明 |
---|---|
after('後ろに追加したいカラム名')
| 指定したカラム名の後ろにカラムを追加します。 |
マイグレーションをロールバックする。
マイグレーションの記述をします。
1 2 3 4 5 6 |
public function down() { Schema::table('テーブル名(users等)', function (Blueprint $table) { $table->dropColumn('カラム名'); }); } |
その後に下記コマンドを実行します。
1 |
php artisan migrate:rollback |
複数回戻したい場合は下記のstepオプションを指定します。
1 |
--step 回数 |
マイグレーションの適用状態を確認する。
マイグレーションの適用状態を確認できます。実行していないものに関してはRan?が「No」になります。
1 |
php artisan migrate:status |
外部キーを設定するには?
1 |
$table->foreign('従テーブル側のキー')->references('主テーブル側のキー')->on('主テーブルテーブル名(users等)'); |
モデルファイルの作成
マイグレーション後にモデルも作成しましょう。(同時に作成もできますが。)
1 |
php artisan make:model モデル名 |
すると下記のディレクトリにPHPファイルが生成されます。
1 |
app/モデル名.php |
実際の開発ではModelsというディレクトリを作成してその下にたくさんのモデルを作成することになりますので、下記のように打ちます。
1 |
php artisan make:model Models/モデル名 |
「マイグレーションファイル」と「コントローラ」をまとめて作成したい場合は「-mc」オプションを付けます。
1 |
php artisan make:model Models/モデル名 -mc |
-m
マイグレーションファイルを同時に生成します。
-c
コントローラーファイルを同時に生成します。
tinker
DBと簡易的に接続し、対話的にDBとやり取りするための仕組みです。
使い方
1 2 3 4 |
$test = new App\Models\Test; $test->text = "aaa"; //モデルインスタンスに値を設定する。 $test->save(); //DBに保存する。 App\Models\Test::all(); //登録したデータを表示する。 |
「1:多」のモデルの定義の仕方
主テーブルの方
hasManyメソッドを使います。
1 2 3 4 5 6 |
class 主テーブルのモデル extends Model { public function 副テーブル名複数形(users等)(){ return $this->hasMany('app\Models\副モデル(User等)',外部キー,自モデルの主キー); } } |
自モデルの主キー
デフォルトはidになります。
副テーブルの方
belongsToメソッドを使います。
1 2 3 4 5 6 |
class Shop extends Model { public function 主テーブルの単数系(user等)(){ return $this->belongsTo('App\Models\主テーブル(user)',外部キー,親モデルの主キー); } } |
「多:多」のモデルの定義の仕方
多テーブルの間に中間テーブルを作成することになります。
多テーブルの方
多テーブルにはどちらもbelongsToManyメソッドを使用して相手の多テーブルを指定するようにしましょう。
1 2 3 4 5 6 |
class 従テーブル名 extends Model { public function 対となる従テーブル名(users等)(){ return $this->belongsToMany('App\Models\対となる従テーブル',中間テーブル名,自モデルの外部キー,関連するモデルの外部キー)->withTimeStamps(); } } |
中間テーブル名
自モデルと関連するモデルそれぞれのモデル名をスネークケースにしてアルファベット順に並べてつなげたもの。
withTimeStamps
デフォルトだと中間テーブルに値が入った際にcreated_atとupdate_atは自動更新されません。自動更新されてほしい場合は、これを定義しておきます。
データを取得する。
1:多の場合
下記のように指定すれば主テーブルに紐づく副テーブルのデータを配列形式で取得する事が可能です。
1 2 3 4 |
use App\Models\主テーブル; use App\Models\副テーブル; $変数(配列で取得できる) = 主テーブル::find(1)->副テーブル(users等の複数形); |
主テーブルと副テーブルを逆にしても問題なく紐づくデータを取得する事が可能です。
多:多の場合
多:多の場合は、下記のように指定すればデータを取得する事が可能です。
1 |
主テーブル::find(1)->副テーブル()->get() |
すでに存在するデータ同士のリレーションを結ぶ。
1:多の場合
すでに存在するデータ同士をリレーションを結ぶこともできます。(もちろん手動でも可能です。)
1 |
子モデルのインスタンス->リレーション名()->associate(親モデルのインスタンス or 外部キー) |
具体的には以下のようになります。(categoryid=2に対してblogのid=1を紐づけている。)
1 |
Blog::find(1)->category()->associate(2); |
また、リレーション関係を削除したい場合は逆にdissociateメソッドを使用します。
多:多の場合
1 |
モデルのインスタンス->リレーション名()->attach(相手モデルの外部キー) |
中間テーブルを意識せずに以下のように設定できます。(blogid=1のデータをcategoryid=2,4に紐づけている。)
1 |
Blog::find(1)->category()->attach([2,4]); |
この記事へのコメントはありません。