Laravel 4、 4.2 docs で説明されている多対多の関係を操作する場合、実際に取得できる方法はLaravel =ピボットテーブルを作成するには?
関係する2つのモデルの移行に何かを追加する必要がありますか?ピボットテーブルの移行を手動で作成する必要がありますか?または、Laravel=ピボットテーブルを作成する方法を知っていますか?
これまでにやったことは、belongsToMany
情報をそれぞれの2つのモデルに追加することです。
class User extends Eloquent
{
public function roles()
{
return $this->belongsToMany('Role');
}
}
ただし、それはピボットテーブルの作成をトリガーしません。どのステップが欠けていますか?
ピボットテーブルを手動で作成する必要があるように見えます(つまり、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 );
}
Jeffrey Wayの Laravel-4-Generators または Laravel-5-Generators-Extended を使用します。
次に、この職人のコマンドを使用できます:
php artisan generate:pivot table_one table_two
ベンの答えを拡張するために(私はそれを編集しようとしましたが、レビュアーはそれが多すぎると言いました)
外部キー制約を追加するには、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');
});
}
多対多の関係の場合、次のようにデータベースの移行ファイルを手動で作成できます。
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();