web-dev-qa-db-ja.com

Laravelによってピボットテーブルはどのように作成されますか?

Laravel 4、 4.2 docs で説明されている多対多の関係を操作する場合、実際に取得できる方法はLaravel =ピボットテーブルを作成するには?

関係する2つのモデルの移行に何かを追加する必要がありますか?ピボットテーブルの移行を手動で作成する必要がありますか?または、Laravel=ピボットテーブルを作成する方法を知っていますか?

これまでにやったことは、belongsToMany情報をそれぞれの2つのモデルに追加することです。

class User extends Eloquent 
{
    public function roles()
    {
         return $this->belongsToMany('Role');
     }
 }

ただし、それはピボットテーブルの作成をトリガーしません。どのステップが欠けていますか?

33
Ben

ピボットテーブルを手動で作成する必要があるように見えます(つまり、Laravelはこれを自動的に行わない)。これを行う方法は次のとおりです。

1.)singularalphabetical orderのテーブル名を使用して、新しい移行を作成します(デフォルト):

php artisan make:migration create_alpha_beta_table --create --table=alpha_beta

2.)新しく作成された移行内で、up関数を次のように変更します。

public function up()
{
    Schema::create('alpha_beta', function(Blueprint $table)
    {
        $table->increments('id');
        $table->integer('alpha_id');
        $table->integer('beta_id');
    });
}

3.)必要に応じて、外部キー制約を追加します。 (私はまだそのビットに達していません)。


ベータのキーを使用して、たとえばアルファテーブルをシードするには、AlphaTableSeederで次の操作を実行できます。

public function run()
{
    DB::table('alpha')->delete();

    Alpha::create( array( 
        'all'           =>  'all',
        'your'          =>  'your',
        'stuff'         =>  'stuff',
    ) )->beta()->attach( $idOfYourBeta );
}
53
Ben

Jeffrey Wayの Laravel-4-Generators または Laravel-5-Generators-Extended を使用します。

次に、この職​​人のコマンドを使用できます:

php artisan generate:pivot table_one table_two
34
user3260759

ベンの答えを拡張するために(私はそれを編集しようとしましたが、レビュアーはそれが多すぎると言いました)

外部キー制約を追加するには、alpha idが署名されていない場合、alpha_idもピボットテーブルで署名されていないことを確認してください。この移行は、作成されたテーブルを変更するため、Benの答えでは(2)の後に実行されます。

public function up()
{
    Schema::table('alpha_beta', function(Blueprint $table)
    {
        $table->foreign('alpha_id')->references('id')->on('alpha');
        $table->foreign('beta_id')->references('id')->on('beta');
    });
}
20
AfzalivE

多対多の関係の場合、次のようにデータベースの移行ファイルを手動で作成できます。

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;

class CreateAccountTagTable extends Migration
{

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('account_tag', function (Blueprint $table) {
            // $table->timestamps(); // not required
            // $table->softDeletes(); // not required

            $table->integer('account_id')->unsigned();
            $table->foreign('account_id')->references('id')->on('accounts');

            $table->integer('tag_id')->unsigned()->nullable();
            $table->foreign('tag_id')->references('id')->on('tags');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('account_tag');
    }
}

:ピボットテーブルにtimestampsがある場合は、次のように両端の関係にwithTimestampsを設定する必要があります。

return $this->belongsToMany(\Mega\Modules\Account\Models\Tag::class)->withTimestamps();

return $this->belongsToMany(\Mega\Modules\Account\Models\Account::class)->withTimestamps();
8
Mahmoud Zalt