web-dev-qa-db-ja.com

Laravel=移行における関係?

$this->belongs_to()$this->has_many()などを使用すると、テーブルのリレーションシップをかなり簡単に定義できることはわかっていますが、リレーションシップテーブルの作成方法がわかりません。 2つのテーブルを一緒にバインドするテーブル(用語の名前を忘れました)。

ユーザーテーブルを作成しているとしましょう。そのユーザーが特定の「ロール」に属していることを望みます。複数の役割があり、すべての役割に複数のユーザーを含めることができます。そのためにrolesテーブルも作成する必要があります。ここまでは順調ですね。

しかし、ドキュメントを読んだ後、移行自体ではなく、モデルに$this->belongs_to()を追加する必要があります。関係テーブルはいつ、どのように作成されますか? rolesおよびusersテーブルを作成し、$this->belongs_to('roles')usersモデルに追加し、$this->has_many('users')rolesモデル、中間テーブルは自動的に作成されますか?

21
qwerty

私の知る限り、リレーションシップテーブルは作成されません。あなたがする必要があるのは、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のすべての長所を使用できます。

お役に立てれば :)

0
gregchapple

移行を作成するときに、テーブルに外部キーを指定できます。

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" セクションを読んで、その方法を確認してください。

48
Roark

最初のいくつかの質問には答えられなかったようです。つまり、「いつ、どのようにリレーションシップテーブルが作成されますか」と「中間テーブルが自動的に作成されます」:

私の知る限り、これらのテーブルは手動で作成する必要があります。そのため、次のように移行ファイルを作成します。

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();
    });
}

お役に立てば幸いです。ピボットテーブルでタイムスタンプが必要かどうかはわかりませんので、試してみてください。

15

その古いポストですが、私は何か更新されたものに貢献できると思います。 Laravel5の場合、Jeffrey Wayはパッケージを開発しましたLaravel5 Generators-extendedphp artisanのジェネレーター機能を強化します

  • make:migration:schema
  • make:migration:pivot
  • make:seed

ユーザーとロールの間の多対多の関係には、次を使用できます。

php artisan make:migration:pivot users role

そして、必要な移行クラスを生成します。このために手動でコーディングする必要はありません。

11
Ariful Haque

私はこれが古い投稿であることを知っていますが、同じ質問を念頭に置いていました。 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');

これが役立つことを願っています。

0
Lino

このビデオは私を助けてくれました。

https://laracasts.com/series/laravel-5-fundamentals/episodes/14

私にとって驚きだったのは、リレーションシップの片側だけが移行テーブルでpointer_idを必要とし、両方ではないということでした。たとえば、多くの記事を持つ著者がいる場合、追加するだけです

$table->integer('author_id')

記事の移行とそれだけです。

0
pera