【问题标题】:Laravel 5 Eloquent Many to Many 2ndary tableLaravel 5 Eloquent 多对多二级表
【发布时间】:2016-03-16 03:21:29
【问题描述】:

我有一个不知道如何解决的问题,甚至不知道如何找到答案。

我有一个多对多相关的公司模型和用户模型。

我想要一个 user_pins 表。一个用户可以属于多个公司,因此在每个公司中都有不同的 pin。该密码在公司内是唯一的,公司内的两个用户不能拥有相同的密码。不同公司的用户可以拥有同一个。

所以对于公司来说是一对多,对于用户来说是一对多,但总的来说是多对多,我不确定这是否有意义。

我的表设置为

Schema::create('user_pins', function (Blueprint $table) {
 $table->integer('user_id')->unsigned();
 $table->integer('company_id')->unsigned();
 $table->string('pin');

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

 $table->primary(['user_id', 'company_id', 'pin']);
});

如何在模型中关联此表并使用 Eloquent 访问/创建/更新它,以便存储用户和公司?

【问题讨论】:

    标签: php model eloquent laravel-5.1 mariadb


    【解决方案1】:

    首先,我将名称更改为company_user,以便它遵循 Laravel 开箱即用的相同命名约定。 (您不必这样做,因为您可以在关系中指定数据透视表名称,但如果没有理由坚持使用user_pin,则遵循约定是有道理的:))

    然后,我将从所有 3 个字段的复合中删除主键,并将其放在 company_id 和 user_id 上。

    最后,由于公司的 PIN 码必须是唯一的,因此我只需将唯一索引放在这两列上,例如

    Schema::create('company_user', function (Blueprint $table) {
    
        $table->integer('company_id')->unsigned()->index();
        $table->integer('user_id')->unsigned()->index();
        $table->string('pin');
    
        $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
        $table->foreign('company_id')->references('id')->on('companies')->onUpdate('cascade')->onDelete('cascade');
    
        $table->primary(['company_id', 'user_id']);
        $table->unique(['company_id', 'pin']);
    });
    

    那么对于模型中的关系,我会有类似的东西:

    return $this->belongsToMany('App\Company')->withPivot('pin');
    

    和

    return $this->belongsToMany('App\User')->withPivot('pin');
    

    枢轴使用示例

    公司的所有用户密码:

    $company->users->lists('pivot.pin');
    

    用户锁定特定公司

    $user->companies()->where('id', $id)->get()->pivot->pin;
    

    第一个公司关系的用户 pin:

    $user->companies->first()->pivot->pin;
    

    希望这会有所帮助!

    【讨论】:

    • company_user 表已经用于我与公司和用户表的多对多关系。你是说我应该在该数据透视表上为图钉添加一个字段?
    • 在这种情况下,是的,你也可以。请记住为company_id 和pin 添加复合唯一索引。
    • 这是有道理的。我将如何通过公司和用户模型访问 pin。例如,如果我想通过公司模型获取所有用户密码,或者只是通过用户模型获取给定公司的用户密码?
    • 我在回答中添加了一些示例。
    • 太好了,这绝对解决了我的难题。将它放在数据透视表上是有道理的,我只是认为它严格用于多对多关系并且没有额外的字段。
    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2021-12-28
    • 2019-06-13
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多