$this->belongs_to()
、$this->has_many()
などを使用すると、テーブルのリレーションシップをかなり簡単に定義できることはわかっていますが、リレーションシップテーブルの作成方法がわかりません。 2つのテーブルを一緒にバインドするテーブル(用語の名前を忘れました)。
ユーザーテーブルを作成しているとしましょう。そのユーザーが特定の「ロール」に属していることを望みます。複数の役割があり、すべての役割に複数のユーザーを含めることができます。そのためにroles
テーブルも作成する必要があります。ここまでは順調ですね。
しかし、ドキュメントを読んだ後、移行自体ではなく、モデルに$this->belongs_to()
を追加する必要があります。関係テーブルはいつ、どのように作成されますか? roles
およびusers
テーブルを作成し、$this->belongs_to('roles')
をusers
モデルに追加し、$this->has_many('users')
をroles
モデル、中間テーブルは自動的に作成されますか?
私の知る限り、リレーションシップテーブルは作成されません。あなたがする必要があるのは、users
テーブルにrole_id
を持つことです。そのため、ユーザーを作成すると、ロールのIDがそこに保存されます。これにより、role_id == '1'
などのすべてのユーザーを選択できます。例えば:
$admins = User::where('role_id', '=', 1);
ROLES
テーブルのID='1'
のレコードはadminです。したがって、質問に答えるために、リレーションシップテーブルは作成されません。代わりに、リレーションシップは、各ユーザーのrole_id
列の形式で2つのテーブル内に存在します。興味深いことに、外部キーを使用していますか?
リレーションシップテーブルが必要な場合は、user_roles
または何かと呼ばれるテーブルを作成し、role_id
およびuser_id
をそこに格納できますが、上記の方法を使用する方が簡単だと思いますLaravel/Eloquentのすべての長所を使用できます。
お役に立てれば :)
移行を作成するときに、テーブルに外部キーを指定できます。
public function up()
{
Schema::table('roles', function(Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
//rest of fields then...
$table->foreign('user_id')->references('id')->on('users');
});
}
これにより、ロールテーブルのuser_id列に外部キーが作成されます。外部キーの利点は、更新または削除が行われると、外部キーテーブルが自動的に更新されるか、すばらしい説明が「カスケード」されることです here
Laravelドキュメントで説明されているように、次の構文を使用して、更新時にカスケードを指定することもできます
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
ドキュメンテーションよりもうまく説明しようとするのは悪い仕事ですので、Eloquent ORMドキュメンテーションの "Relationships" セクションを読んで、その方法を確認してください。
最初のいくつかの質問には答えられなかったようです。つまり、「いつ、どのようにリレーションシップテーブルが作成されますか」と「中間テーブルが自動的に作成されます」:
私の知る限り、これらのテーブルは手動で作成する必要があります。そのため、次のように移行ファイルを作成します。
Laravel 5
php artisan make:migration create_role_user_table
Laravel 4
php artisan migrate:make create_role_user_table
名前は単数形であり、アルファベット順に表示されることに注意してください。
次に、移行では次のようにします。
public function up()
{
Schema::create('role_user', function($table) {
$table->increments('id');
$table->integer('role_id');
$table->integer('user_id');
$table->timestamps();
});
}
お役に立てば幸いです。ピボットテーブルでタイムスタンプが必要かどうかはわかりませんので、試してみてください。
その古いポストですが、私は何か更新されたものに貢献できると思います。 Laravel5の場合、Jeffrey Wayはパッケージを開発しましたLaravel5 Generators-extendedphp artisan
のジェネレーター機能を強化します
make:migration:schema
make:migration:pivot
make:seed
ユーザーとロールの間の多対多の関係には、次を使用できます。
php artisan make:migration:pivot users role
そして、必要な移行クラスを生成します。このために手動でコーディングする必要はありません。
私はこれが古い投稿であることを知っていますが、同じ質問を念頭に置いていました。 Laravel manual(5.0) で解決策を見つけました。この特定の多対多リレーションシップでは、テーブルを手動で作成し、リレーションシップのタイプをModelに宣言できると記述されていますこちらです:
return $this -> belongsToMany('App\<Model>', '<table_created_manually>');
または、特定の関連キーを使用する場合:
return $this -> belongsToMany('App\<Model>', '<rel_table1_table2>' '<table1>_id', '<table2>_id');
これが役立つことを願っています。
このビデオは私を助けてくれました。
https://laracasts.com/series/laravel-5-fundamentals/episodes/14
私にとって驚きだったのは、リレーションシップの片側だけが移行テーブルでpointer_idを必要とし、両方ではないということでした。たとえば、多くの記事を持つ著者がいる場合、追加するだけです
$table->integer('author_id')
記事の移行とそれだけです。