2013-04-04 178 views
25

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

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

所有我迄今所做的就是添加belongsToMany信息两个各自的模型,即

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

然而,这不会触发枢轴表的创建?我错过了什么步骤?

回答

41

似乎数据透视表确实需要手动创建(即Laravel不会自动执行此操作)。以下是如何做到这一点:

1)在按字母顺序创建一个新的迁移,使用奇异表名(默认):

php artisan migrate:make 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); 
} 
+0

如果您正在调用未定义的方法...“当你的种子试图运行{model}() - >附加(/ ...方法时,记得为这两个tablese创建一个模型,并在其中一个属于其中的一个属于其中。 例如,对于此示例: /Alpha.php你将包括: 公共功能测试(){ 回报$这个 - > belongsToMany( '测试版');} 我 – sersun 2014-10-30 02:07:02

+0

认为第一步应该是:'''PHP工匠迁移:使create_alpha_beta_table --create = alpha_beta''' – Adamski 2015-02-03 11:59:43

+1

从Laravel 5开始,artisan的命令是'make:migration' – Jason 2016-04-05 13:16:56

17

为了扩大本的答案(我尝试过编辑,但评论者说它增加了太多):

要添加外键约束,请确保alpha标识是否是无符号的,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

谁对1.5岁的答案downvoted。下一次,更正意见。 – AfzalivE 2015-02-12 22:41:29

+1

你想添加一个onDelete('cascade');? – 2017-09-06 17:00:49

30

我用杰弗里路的Laravel-4-GeneratorsLaravel-5-Generators-Extended

那么你可以使用这个工匠命令:

php artisan generate:pivot table_one table_two 
+1

这也创建了外键约束。 – 2014-12-24 09:27:00

+2

对于Laravel-5-Generators-Extended,命令是'make:migration:pivot',不再是'generate:pivot'(就像在Laravel-4-Generators中一样)。 – Jon 2016-02-15 20:00:11

5

对于多对多关系中,你可以手动创建数据库的迁移文件是这样的:

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