50

Laravel 4 では、4.2 のドキュメントで説明されているように多対多の関係を扱う場合、実際に Laravel にピボット テーブルを作成させるにはどうすればよいですか?

関連する 2 つのモデルの移行に何かを追加する必要がありますか? ピボット テーブルの移行を手動で作成する必要がありますか? または、Laravel はどのようにしてピボット テーブルを作成することを知っているのでしょうか?

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

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

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

4

7 に答える 7

71

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

1.)単一のテーブル名をアルファベット順に使用して、新しい移行を作成します(デフォルト)。

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 );
}
于 2013-04-05T12:30:27.407 に答える
43

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

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

php artisan generate:pivot table_one table_two
于 2014-02-15T16:59:21.990 に答える
26

ベンの回答を拡張するには(編集しようとしましたが、レビュアーは追加が多すぎると言いました):

外部キー制約を追加するには、アルファ 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');
    });
}
于 2013-06-03T06:22:05.707 に答える
12

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

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();
于 2016-04-07T07:08:19.520 に答える
11
  1. 新しい移行を作成します。
php artisan make:migration create_alpha_beta_table --create=alpha_beta
  1. 新しく作成された移行の内部:
public function up() {
    Schema::create('alpha_beta', function(Blueprint $table) {
            $table->increments('id');
            $table->unsignedBigInteger('alpha_id');
            $table->unsignedBigInteger('beta_id');
            // foreign keys
            $table->foreign('alpha_id')->references('id')->on('alphas');
            $table->foreign('beta_id')->references('id')->on('betas');
     });
}
于 2019-10-24T11:06:02.607 に答える