首页 文章

Laravel在迁移中的关系?

提问于
浏览
19

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

让's say i' m创建一个用户表 . 我希望该用户属于某个"Role" . 有多个角色,每个角色可以有多个用户 . 我还需要为此创建一个 roles 表 . 到现在为止还挺好 .

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

6 回答

  • 1

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

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

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

    如果你想有一个关系表,你可以创建一个名为 user_roles 或东西,存储 role_iduser_id 在那里,但我认为它更容易使用上面的方法,那么你可以使用所有的Laravel /雄辩善良 .

    希望这可以帮助 :)

  • 0

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

    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列上创建一个外键 . 外键的好处是,当进行更新或删除时,外键表将自动更新或"cascaded"找到了很好的描述here

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

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

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

  • 10

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

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

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

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

  • 42

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

    • make:migration:schema

    • make:migration:pivot

    • make:seed

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

    php artisan make:migration:pivot users role
    

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

  • 15

    这段视频帮助了我 .

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

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

    $table->integer('author_id')
    

    文章迁移就是这样 .

  • 0

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

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

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

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

    希望这可以提供帮助 .

相关问题