36

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

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

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

4

6 回答 6

74

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

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

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

如 Laravel 文档中所述,您还可以使用以下语法指定更新时的级联

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

我会做得不好,试图比文档更好地解释它,所以请通读 Eloquent ORM 文档的“关系”部分,看看它是如何完成的。

于 2013-06-22T21:08:58.207 回答
20

看起来一些最初的问题从未得到回答,即“何时以及如何创建关系表”和“是否会自动创建中间表”:

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

拉拉维尔 5

php artisan make:migration create_role_user_table

拉拉维尔 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();
    });
}

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

于 2013-10-15T08:41:11.953 回答
14

虽然它是一个旧帖子,但我虽然可以贡献一些更新的东西。对于 Laravel5,Jeffrey Way开发了一个包Laravel5 Generators-extended,它增强了php artisanfor

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

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

php artisan make:migration:pivot users role

它将生成所需的迁移类。您无需为此手动编码。

于 2015-04-30T03:07:39.230 回答
2

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

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

表中ROLES记录的ID='1'位置是管理员。因此,再次回答您的问题,没有创建关系表,而是在您的两个表中以role_id每个用户的列的形式存在关系。出于兴趣,您是否使用外键?

如果你想有一个关系表,你可以创建一个名为user_rolesor something 并将 and 存储role_iduser_id那里,但是我认为使用上述方法更容易,因为你可以使用 Laravel/Eloquent 的所有优点。

希望这可以帮助 :)

于 2012-11-27T19:51:19.303 回答
1

这个视频帮助了我。

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

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

$table->integer('author_id')

文章迁移,仅此而已。

于 2016-12-09T00:34:23.217 回答
1

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

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

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

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

希望这能有所帮助。

于 2018-03-09T14:50:51.843 回答