Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 需要帮助构建雄辩的多对多关系(laravel 5.1)_Php_Mysql_Laravel 5_Eloquent_Laravel 5.1 - Fatal编程技术网

Php 需要帮助构建雄辩的多对多关系(laravel 5.1)

Php 需要帮助构建雄辩的多对多关系(laravel 5.1),php,mysql,laravel-5,eloquent,laravel-5.1,Php,Mysql,Laravel 5,Eloquent,Laravel 5.1,我正在尝试构建一个“facebook群组”风格的应用程序,其中包含充满成员的群组,每个成员都有一个成员类型(例如管理员、官员、用户…),每个群组都有自己的群组类型(公开、封闭、秘密) 因此,我创建了几个表: users - (id, name ..) groups - (id, name, group_type_id ..) group_types - (id, type) group_members - (user_id, group_id, membership_type_id) gro

我正在尝试构建一个“facebook群组”风格的应用程序,其中包含充满成员的群组,每个成员都有一个成员类型(例如管理员、官员、用户…),每个群组都有自己的群组类型(公开、封闭、秘密)

因此,我创建了几个表:

users - (id, name ..)
groups - (id, name, group_type_id ..)  
group_types - (id, type)
group_members - (user_id, group_id, membership_type_id)
group_membership_types - (id, type)
我相信这是构建数据库的正确方法(如果我错了,请纠正我)

现在我需要将其转换为雄辩的模型,因此我创建了模型,但在尝试建立它们之间的关系时,我感到非常困惑,我阅读了有关“pivot”和“hasManyThrough”的文章,甚至感到更加困惑

以下是我迄今为止创建的模型:

class Group extends BaseModel
{ 
    protected $table = 'groups';

    public function Members() {
        return $this->belongsToMany('App\GroupMemeber');
    }

    public function Type() {
        return $this->belongsTo('App\GroupType');
    }
}
--

--

--


我做得对吗?您将如何创建这些模型?

透视表惯例 按照惯例,透视表的名称为
tablename1\u tablename2
,其中
tablename1
按字母顺序取代
tablename2
。在这种情况下,
group\u成员
应该是
group\u用户
。如果您更改了这一点,则不需要定义$table变量,因此如果需要,可以删除这些变量来清理代码

雄辩的关系 有说服力的关系是,如果您不确定,您可以随时参考代码文档,这是非常直接的:

hasOne

Define a one-to-one relationship.
Define a has-many-through relationship.
Define a many-to-many relationship. 
有很多

Define a one-to-many relationship.
hasManyThrough

Define a one-to-one relationship.
Define a has-many-through relationship.
Define a many-to-many relationship. 
属于sto

Define an inverse one-to-one or many relationship.
属于造口

Define a one-to-one relationship.
Define a has-many-through relationship.
Define a many-to-many relationship. 
使用数据透视表时,您可以添加
->withPivot()
,Eloquent将自动查找按常规命名的数据透视表。这些“中间”对象甚至不需要模型,因为它们(可能)不会在表示层中使用

三向数据透视表 现在,关于你的团队成员,这里是事情变得有点复杂的地方。
hasManyThrough
关系是为,而不是您要寻找的。Laravel不为这种类型的关系提供任何“即插即用”功能,尽管出于这一目的,它并不是非常动态,但只提供三方功能。目前这还可以,但如果您决定在将来扩展透视表,该怎么办?然后这个就坏了

重组数据库 我查看了您的表格结构,发现它可以很容易地进行重组:

通过避免使用三向透视表,您的代码(和表结构)更易于维护,可读性也更高。我认为这适用于任何具有三向关系的透视表,一个好的经验法则是通过使用更智能的表结构来避免它

结果 使用者 使用者

  • 属于许多会员
  • 通过会员身份拥有许多团体
代码:

会员 会员

  • 有很多用户
  • 属于一个团体
代码:

团体 一群

  • 他有很多会员
  • 通过会员身份拥有许多用户
代码: