Laravel在迁移中的关系?

时间:2012-11-24 12:08:14

标签: database migration relationship laravel

我知道您可以使用$this->belongs_to()$this->has_many()等相当容易地定义表关系,但我不明白的是如何创建关系表;将两个表绑定在一起的表(我忘记了这个术语的名称)。

假设我正在创建一个用户表。我希望该用户属于某个“角色”。有多个角色,每个角色可以有多个用户。我还需要为此创建一个roles表。到目前为止,非常好。

但在阅读完文档之后,它说我应该在模型中添加$this->belongs_to(),而不是迁移本身。何时以及如何创建关系表?如果我创建rolesusers表,并将$this->belongs_to('roles')添加到users模型,将$this->has_many('users')添加到roles模型,中间表是自动创建的吗?

6 个答案:

答案 0 :(得分:44)

创建迁移时,您可以在表上指定外键, 即。

public function up()
{
    Schema::table('roles', function(Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id')->unsigned();
        //rest of fields then...
        $table->foreign('user_id')->references('id')->on('users');
    });
}

这将在roles表的user_id列上创建一个外键。 外键的好处是,当进行更新或删除时,外键表将自动更新或“级联”,找到了很好的描述here

如Laravel文档中所述,您还可以使用以下语法

指定更新时的级联
$table->foreign('user_id')
  ->references('id')->on('users')
  ->onDelete('cascade');

我会尝试更好地解释它而不是文档,所以请仔细阅读Eloquent ORM文档的"Relationships"部分,看看它是如何完成的。

答案 1 :(得分:15)

看起来似乎从未回答过一些初始问题,即“何时以及如何创建关系表”& “将自动创建中间表”:

据我所知,这些表需要手动创建。因此,像这样创建迁移文件:

Laravel 5

php artisan make:migration create_role_user_table

Laravel 4

php artisan migrate:make create_role_user_table

请注意,名称是单数,并按字母顺序显示。

然后在迁移中,例如:

public function up()
{
    Schema::create('role_user', function($table) {
        $table->increments('id');
        $table->integer('role_id');
        $table->integer('user_id');
        $table->timestamps();
    });
}

希望有所帮助。我不确定数据透视表中是否需要时间戳,所以请试验。

答案 2 :(得分:10)

虽然它是一个旧帖子,但我可以提供更新的内容。对于Laravel5, Jeffrey Way 开发了一个包 Laravel5 Generators-extended ,它增强了php artisan的生成器功能

  • make:migration:schema
  • make:migration:pivot
  • make:seed

对于用户和角色之间的多对多关系,您只需使用

即可
php artisan make:migration:pivot users role

它将生成所需的迁移类。您不需要手动编码。

答案 3 :(得分:1)

据我所知,不会创建任何关系表。您需要做的是在role_id表上有users,这样当您创建用户时,角色的ID将存储在那里。这样您就可以选择role_id == '1'或其中任何可能的用户。 例如:

$admins = User::where('role_id', '=', 1);

ROLES表上ID='1'的记录是admin。 因此,再次回答您的问题,不会创建任何关系表,而是在每个用户的role_id列形式的两个表中存在关系。出于兴趣,你使用外键吗?

如果你想拥有一个关系表,你可以创建一个名为user_roles的东西,然后将role_iduser_id存储在那里,但我认为更容易使用上述方法那时你可以使用所有的Laravel / Eloquent善良。

希望这会有所帮助:)

答案 4 :(得分:0)

这段视频帮助了我。

https://laracasts.com/series/laravel-5-fundamentals/episodes/14

令我惊讶的是,只有关系的一方需要在迁移表中使用pointer_id,而不是两者。例如,如果我们有许多文章的作者,我们只添加

DataRow

文章迁移,就是这样。

答案 5 :(得分:0)

我知道这是一个老帖子,但我心里也有同样的问题。我在Laravel manual (5.0)中找到了解决方案,其中描述了对于这种特定的多对多关系,您可以手动创建表,然后以这种方式将关系类型声明为模型:

return $this -> belongsToMany('App\<Model>', '<table_created_manually>');

或者如果您想使用特定的关联键:

return $this -> belongsToMany('App\<Model>', '<rel_table1_table2>' '<table1>_id', '<table2>_id');

希望这可以提供帮助。

相关问题