【问题标题】:MySQL/Eloquent belongsToMany relation - two tables same pivot table allowed?MySQL / Eloquent belongsToMany 关系 - 允许两个表相同的数据透视表?
【发布时间】:2015-10-16 11:14:14
【问题描述】:

是否允许有两个表,每个表都有一个 belongsToMany() 关系,使用同一个数据透视表?

这是我的用户表:

这是我的组织表:

这是数据透视表:

这是 Eloquent User.php 模型:

<?php

namespace App;

use Illuminate\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model {

    protected $table = 'users';
    public $timestamps = true;

    use Authenticatable;
    use SoftDeletes;

    protected $dates = ['deleted_at'];

    public function orgs()
    {
        return $this->belongsToMany('App\Org', 'org_user', 'org_id', 'user_id')->withPivot('role_id');
    }
}

这里是 Eloquent Org.php 模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Org extends Model {

    protected $table = 'orgs';
    public $timestamps = true;

    use SoftDeletes;

    protected $dates = ['deleted_at'];

    public function users()
    {
        return $this->belongsToMany('App\User', 'org_user', 'org_id, user_id')->withPivot('role_id');
    }

}

这样做可以吗? (即使用共享数据透视表)有经验的人是否预见到这里有任何问题?或者也许有人可以评论标准做法/分享一些见解?

【问题讨论】:

  • 然而,这看起来像是一个编程问题。首先,您能否在 MySQL 上启用通用日志,以便我们可以看到发送到服务器的实际查询,而不是 PHP 代码?其次,您能否将您的表格结构重新发布为(格式化)文本而不是图形(无法将图形剪切并粘贴到 mysql 客户端)。
  • 嗨 Vérace,所以我有一个 User->belongsToMany()->Org 关系和一个 Org->belongsToMany()->User 关系。我对两种关系都使用相同的数据透视表(如上)。我将 org_id/user_id 对设置为唯一。你能评论一下共享的枢轴吗?
  • 很难想象。您能否为所有表运行 SHOW CREATE TABLE My_Table\G 并将结果文本(格式化为代码)与您的问题一起发布。然后在此处使用@Vérace 发表评论。
  • 投票将其转让给 SO。我怀疑这个站点中是否有人对 php/eloquent 有经验。

标签: mysql database-design php eloquent


【解决方案1】:

绝对可以!这是多对多关系的美妙之处,事实上http://laravel.com/docs/4.2/eloquent#many-to-many 的示例具有UserRole 类都设置为belongsToMany。认为在这种情况下(听起来也像你的情况)一个用户可以拥有多个角色,并且每个角色都可以与多个用户相关联。

关于您的最后两个问题,唯一让我停顿的部分是在数据透视表中使用 role_id。您提供的代码没有详细说明其用途。只要 User 永远只有一个角色与 Org 相关联,这很好,但如果它可能不止一个,我会推荐另一个表来保存它用户组织角色的关系。

【讨论】:

  • 这是一个非常有用的确认。你的建议也很有用。谢谢。
猜你喜欢
  • 2018-09-26
  • 2021-03-30
  • 2020-08-22
  • 2019-01-25
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
相关资源
最近更新 更多