Laravel命名規則
laravelには色々な命名規則があります。必ず守らなければいけないというわけではないのですが、守っていたらめんどうな記述が減ります。特にDB周辺。
モデルとマイグレーションファイルの命名規則
•モデルは単数系のパスカルケースにする。
•マイグレーションファイルはモデル名の複数形をスネークケースにする。
この規則を守らないとモデルにテーブル名を自分で指定しないといけません。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
//ちょっとだるい
protected $table = 'my_flights';
}
このような問題を避けるためにモデルを作成する時に-mオプションをつければlaravelが勝手に指定したモデル名の複数形のスネークケースでマイグレーションファイルを作成してくれます。
php artisan make:model モデル名 -m
リレーション定義の命名規則
参考:https://readouble.com/laravel/11.x/ja/eloquent-relationships.html
1対多のリレーションの場合
+-------------+ +-------------+
| users | | posts |
+-------------+ +-------------+
| id (PK) | <--+ | id (PK) |
| name | | | title |
| email | +-----| user_id (FK) |
+-------------+ +-------------+
•親側(1側)のテーブルの主キーはidにする。
•子側(多側)のテーブルの外部キーは親テーブル名の単数形に _id を付けたものにする。
この条件を守ってテーブルを作成するとリレーション定義を省略できます。
リレーションを定義する方法
1対多のリレーションを作成する際、親側(1側)モデルでは hasMany メソッドを使い、子側(多側)モデルでは belongsTo メソッドを使います。
親側(1側)
class User extends Model
{
public function posts()
{
//命名規則守っているパターン
return $this->hasMany(Post::class);
//命名規則守っていないパターン
return $this->hasMany(Post::class, usersテーブルの主キー, postsテーブルの外部キー)
}外部キー
}
子側(多側)
class Post extends Model
{
public function user()
{
//命名規則守っているパターン
return $this->belongsTo(User::class);
//命名規則守っていないパターン
return $this->belongsTo(User::class, postsテーブルの外部キー, usersテーブルの主キー);
}
}
関数名の規則はないのですが意味を持たせてあげることが大事らしいです。
定義したリレーションに基づいて、LaravelのEloquent ORMを使用して簡単にデータベース操作を行うことができます
// 特定のユーザーの投稿を取得
$user = User::find(1); // IDが1のユーザーを取得
$posts = $user->posts; // そのユーザーが作成したすべての投稿を取得
以上が1対多のリレーションです。
多対多のリレーションの命名規則は1対多のリレーションよりややこしいです。
多対多のリレーションの場合
+-----------+ +-----------------------+ +-----------+
| movies | | actor_movie | | actors |
+-----------+ +-----------------------+ +-----------+
| id (PK) |<--------| actor_id (FK, PK) |-------->| id (PK) |
| title | | movie_id (FK, PK) | | name |
+-----------+ +-----------------------+ +-----------+
•中間テーブルの名は関連するテーブルを単数形にしてアルファべット順にして_で繋げる。
(今回の場合はactor_movieテーブル)
•中間テーブルの外部キーは関連するテーブル名の単数形に_idとする。
•関連するテーブルの主キーはidとする。
この条件を守ってテーブルを作成するとリレーション定義を省略できます。
リレーションを定義する方法
多対多のリレーションを作成する際、関連するモデルそれぞれにbelongsToManyメソッドを使います。またbelongsToManyを使うと中間テーブル用のモデルの作成を省略することができます。追加の設定が必要な場合だけ中間テーブル用のモデルを作成してください。
class Actor extends Model
{
public function movies()
{
//命名規則守っているパターン
return $this->belongsToMany(Movie::class);
//命名規則守っていないパターン
return $this->belongsToMany(Movie::class, '中間テーブル名', '自モデルの外部キー', '関連するモデルの外部キー');
}
}
class Movie extends Model
{
public function actors()
{
//命名規則守っているパターン
return $this->belongsToMany(Actor::class);
//命名規則守っていないパターン
return $this->belongsToMany(Actor::class, '中間テーブル名', '自モデルの外部キー', '関連するモデルの外部キー');
}
}
多対多のリレーションも同様に簡単にデータベース操作を行うことができます。
// 特定の俳優が出演したすべての映画を取得
$actor = Actor::find(1); // IDが1の俳優を取得
$movies = $actor->movies; // その俳優が出演したすべての映画を取得
laravelでは他にも命名規則があるので後々まとめたいと思います。