如何通过laravel创建数据透视表

时间:2013-04-04 21:13:44

标签: laravel pivot-table laravel-4 eloquent

在Laravel 4中,当处理http://four.laravel.com/docs/eloquent#many-to-many中描述的多对多关系时,我怎样才能真正让Laravel为我创建数据透视表?

我是否需要在迁移中为所涉及的两个模型添加一些内容?我是否需要为数据透视表手动创建迁移?或者Laravel如何知道创建数据透视表?

到目前为止,我所做的只是将belongsToMany信息添加到两个相应的模型中,即

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

但是,这不会触发数据透视表的创建?我错过了什么步骤?

7 个答案:

答案 0 :(得分:50)

似乎需要手动创建数据透视表(即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.)如果需要,添加外键约束。 (我还没有那么做)。


现在,使用来自测试版的密钥对alpha表进行播种,您可以在AlphaTableSeeder中执行以下操作:

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

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

答案 1 :(得分:33)

我使用Jeffrey Way的Laravel-4-GeneratorsLaravel-5-Generators-Extended

然后你可以使用这个工匠命令:

php artisan generate:pivot table_one table_two

答案 2 :(得分:20)

扩展Ben的答案(我试图编辑它,但审稿人说它增加了太多):

要添加外键约束,请确保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');
    });
}

答案 3 :(得分:8)

对于多对多关系,您可以手动创建数据库的迁移文件,如下所示:

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

答案 4 :(得分:1)

除了以上所有答案

  • 数据透视表不需要 AI 索引。它由其元组 (key1,key2) 唯一定义。
  • 主键应该是组合 (key1,key2)。好处是元组是唯一的,并且所有查询都得到了最佳优化。

这里有一个真实的例子:

Schema::create('bill_user', function (Blueprint $table) {
    // unsigned is needed for foreign key
    $table->integer('user_id')->unsigned();
    $table->integer('bill_id')->unsigned();

    $table->primary(['user_id', 'bill_id']);

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

    $table->foreign(bill_id')
        ->references('id')->on('bills')
        ->onDelete('cascade');
});

答案 5 :(得分:0)

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

答案 6 :(得分:-2)

按字母顺序使用单数表名这是这个lol的关键