2012-11-24 10 views
13

$this->belongs_to()$this->has_many()などでテーブルの関係をかなり簡単に定義できますが、関係テーブルの作成方法はわかりません。 2つのテーブルを結合するテーブル(私はその用語が何と呼ばれているか忘れていました)。移行のラーベル関係

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

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

+0

"私はその用語が何であるかを忘れていました"とは、あなたが元のDBバックグラウンドに応じて、これらのテーブルを一般にピボットテーブル、中間テーブルまたはルックアップテーブルといいます。 –

答えて

0

私が知る限り、関係テーブルは作成されません。あなたがする必要があるのはテーブルにrole_idがあるため、ユーザーを作成するときにロールのIDがそこに格納されるようになります。これにより、role_id == '1'などのすべてのユーザーを選択できます。たとえば :ROLESテーブルの上にID='1'を持つレコードはadmin

$admins = User::where('role_id', '=', 1); 

。 あなたの質問に答えるために、リレーションシップテーブルは作成されず、リレーションシップは各ユーザーのrole_id列の形式で2つのテーブル内に存在します。興味のない外来キーを使用していますか?

あなたがuser_rolesか何かと呼ばれるものを作成し、そこでのrole_iduser_idを保存することができな関係テーブルを持つようにしたい場合は、しかし、私はそのより簡単のように、あなたはすべてのLaravel /雄弁の良さを使用することができ、上記の方法を使用することを考えます。

・ホープこのことができます:)

+1

お返事ありがとうございます!私は、1人のユーザーにつき1つの役割しか保存しないと、関係表が必要ないことを理解しました。しかし、すべてのユーザーが無制限の役割を果たすことができたらどうでしょうか?それから別のテーブルに格納する以外の方法はありません。それはどのように機能しますか?私はLaravelがあなたのためにこれらのテーブルを自動的に作成して管理できることを知っていますが、どのように、どこで、いつ行うのでしょうか。 – qwerty

+0

マイグレーションファイルを変更したり、モデルファイル内のリレーションシップを定義するだけで、データベース自体にリレーションシップを作成するかどうかは、どちらが良いでしょうか? または両方のテクニックを使用してください –

30

を移行を作成するときに、あなたのテーブルに外部キーを指定することができ、 すなわち

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の列に外部キーを作成します。 Laravelのドキュメント上で説明したように、外部キーの 利点はあなたにも使用して更新時に、あなたのカスケードを指定することができhere

を発見した場合、更新または削除外部キーテーブルが自動的に更新さや偉大な説明を「カスケード接続」されるということです私はそれがドキュメントよりも良いので、そのを行う方法を確認するために雄弁ORMのドキュメントの"Relationships"セクションを読んでくださいません説明しようとするの悪い仕事をするだろう、次の構文

$table->foreign('user_id') 
    ->references('id')->on('users') 
    ->onDelete('cascade'); 

+0

@Roarkあなたはおそらくカラム "user_id"が最初に作成されるべきであると言及すべきでした。そうでなければ、 '' ' [Illuminate \ Database \ QueryException] SQLSTATE [42703] :定義されていない列:7 ERROR:外部キー制約で参照されている列 "lang_id"が存在しません(SQL:alter table "op_cities"制約を追加してください "op_cities_lang_i d_foreign" foreign key( "lang_id")参照 "translator_languages"( "id") ) '' ' – abbood

+0

ここの例:https://www.easylaravelbook.com/blog/adding-foreign-key-references-using-a-laravel-migration/ – abbood

+1

@abbood詳細なマイグレーションの例を示すように更新された回答 – Roark

10

&「はミドルテーブルが自動的に作成されます」「作成された関係テーブルである場合には、どのように」最初の質問のいくつかは、すなわちに答えれなかったように見えます:

私の知る限りこれらのテーブルは手動で作成する必要があります。名前は単数形で、アルファベット順に提示されていることを

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

希望に役立ちます。ピボットテーブルでタイムスタンプが必要かどうか分からないので、試してみてください。

+1

'migrate:make'はLaravel 5.4の職人にはなく、' php artisan make:migration'です –

7

古い投稿ですが、私は何かを更新することはできますが、 Laravel5については、ジェフリー・ウェイパッケージに多対多の関係については

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

ためphp artisanの発電能力を高めるLaravel5 Generators-extendedを開発しました。ユーザーと役割の間には、

php artisan make:migration:pivot users role 

となり、必要な移行クラスが生成されます。これを手動でコードする必要はありません。

0

このビデオは私を助けました。私にとっては驚くべきことであった何

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

関係の片側のみが移行テーブルでpointer_id、両方ではないが必要であるということでした。たとえば、著者に多くの記事がある場合、記事の移行には

$table->integer('author_id') 

を追加するだけです。

0

私はこれが古い投稿だと知っていますが、私は同じ質問を念頭に置いていました。私はこの特定の多対多の関係のために手動でテーブルを作成することができ、その後、このようにモデルに関係の型を宣言することが記載されているLaravel manual (5.0)で解決策を見つけた:

​​

か特定の関連するキーを使用する場合:

return $this -> belongsToMany('App\<Model>', '<rel_table1_table2>' '<table1>_id', '<table2>_id'); 

希望すると便利です。

関連する問題