laravel创建的数据透视表
在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');
}
}
然而,这不会触发枢轴表的创建?我错过了什么步骤?
似乎数据透视表确实需要手动创建(即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);
}
为了扩大本的答案(我尝试过编辑,但评论者说它增加了太多):
要添加外键约束,请确保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');
});
}
谁对1.5岁的答案downvoted。下一次,更正意见。 – AfzalivE 2015-02-12 22:41:29
你想添加一个onDelete('cascade');? – 2017-09-06 17:00:49
我用杰弗里路的Laravel-4-Generators或Laravel-5-Generators-Extended。
那么你可以使用这个工匠命令:
php artisan generate:pivot table_one table_two
这也创建了外键约束。 – 2014-12-24 09:27:00
对于Laravel-5-Generators-Extended,命令是'make:migration:pivot',不再是'generate:pivot'(就像在Laravel-4-Generators中一样)。 – Jon 2016-02-15 20:00:11
对于多对多关系中,你可以手动创建数据库的迁移文件是这样的:
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();
如果您正在调用未定义的方法...“当你的种子试图运行{model}() - >附加(/ ...方法时,记得为这两个tablese创建一个模型,并在其中一个属于其中的一个属于其中。 例如,对于此示例: /Alpha.php你将包括: 公共功能测试(){ 回报$这个 - > belongsToMany( '测试版');} 我 – sersun 2014-10-30 02:07:02
认为第一步应该是:'''PHP工匠迁移:使create_alpha_beta_table --create = alpha_beta''' – Adamski 2015-02-03 11:59:43
从Laravel 5开始,artisan的命令是'make:migration' – Jason 2016-04-05 13:16:56