Laravel在迁移中的关系?

qwe*_*rty 21 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模型中,将中间表自动创建?

Roa*_*ark 52

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

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');
    });
}
Run Code Online (Sandbox Code Playgroud)

这将在roles表的user_id列上创建一个外键.外键的好处是,当进行更新或删除时,外键表将自动更新或"级联",这里有很棒的描述

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

$table->foreign('user_id')
  ->references('id')->on('users')
  ->onDelete('cascade');
Run Code Online (Sandbox Code Playgroud)

我会尝试解释它比文档更好,所以请阅读Eloquent ORM文档的"关系"部分,看看它是如何完成的.


Mer*_*ent 15

看起来好像从未回答过一些初始问题,即"何时,以及如何创建关系表"和"将自动创建中间表":

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

Laravel 5

php artisan make:migration create_role_user_table
Run Code Online (Sandbox Code Playgroud)

Laravel 4

php artisan migrate:make create_role_user_table
Run Code Online (Sandbox Code Playgroud)

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

然后在迁移中,例如:

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

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

  • `migrate:make`不是Laravel 5.4的工匠,它是'php artisan make:migration` (2认同)

Ari*_*que 11

虽然它是一个旧帖子,但我可以提供更新的内容.对于Laravel5,杰弗里的方式,制定了一系列Laravel5发电机扩展其增强的生成器功能php artisan

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

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

php artisan make:migration:pivot users role
Run Code Online (Sandbox Code Playgroud)

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


小智 2

据我所知,不会创建任何关系表。您需要做的是role_id在您的users表上添加一个,以便当您创建用户时,角色的 ID 将存储在那里。这将使您能够选择所有用户(role_id == '1'无论位于何处)。例如:

$admins = User::where('role_id', '=', 1);
Run Code Online (Sandbox Code Playgroud)

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

如果你想要一个关系表,你可以创建一个名为或 的东西,并将anduser_roles存储在其中,但是我认为使用上述方法更容易,因为这样你就可以使用 Laravel/Eloquent 的所有优点。role_iduser_id

希望这可以帮助 :)