2017-10-28 298 views
11

laravel数据透视表和数据透视表通常是什么?这是怎么回事?Laravel的数据透视表+一般的数据透视表

最近我做了关于Pivot表的研究。我以为我知道他们和他们是什么,但后来我可能错了。

我一直认为数据透视表仅仅是一个表,它是两个表(关系多对多)

但随后之间,我开始这项研究和它发生是不是,但像不同的体系结构普通表格,其中行是列。它改变了。

但是之后Laravel也获得了数据透视表。开始阅读文档并进行研究。可能我读错了,但它看起来就像在两张表之间的laravel - table中的透视表,多对多。

在其他地方搜索,但无法找到有关它的正确信息。

好吧,就这样吧。 Laravel的枢纽很多很多!

然后我开始了项目,今天我开始将这个中间表作为关键点将问题推给了一个问题,我遇到了一个问题......分钟和几小时......无法解决这个问题。

型号为class Room_Student extends Pivot

,什么是修复?只需将其更改为class Room_Student extends Model即可。

我不认为我了解数据透视表了,它们是不同类型的枢轴?拉拉维尔的枢纽是不同的?

所以我的问题是,什么数据透视表真的是什么? + Laravel的数据透视表。他们不一样吗?这是关于什么的?

请帮我理解这一点。

+1

我发现有关枢轴表和laravel详细解释。它值得能够检查出来。 http://laraveldaily.com/pivot-tables-and-many-to-many-relationships/ –

+0

数据透视表只是一个额外的表,可能会通过2个数据模型之间的多对多关系而发生。这只是所有这些人发现的一种方式,它们使用数据库来相互连接数据并关注所有这些最佳实践规则。这可能是现在最好的方法。我们会看看这种情况是否会在未来发生变化。你只需要使用这种方法的索引,如果你研究了数据库,这是一个非常快速的查找数据的方法。 –

+1

“关联表通常以许多名称通用,包括*关联表*,*桥表*,*交叉引用表*,* crosswalk *,*中间表*,*交叉表*,*连接表*,*连接表*,*链接表*,*链接表*,*多对多解析器*,*映射表*,*映射表*,*配对表*,**数据透视表**(用于Laravel - 不是与[数据透视表(电子表格)](https://en.wikipedia.org/wiki/Pivot_table))或*转换表*“混淆。 - https://en.wikipedia.org/wiki/Associative_entity –

回答

10

学习时,只关注Laravel(或雄辩)中的数据透视表概念。当我学习时,我不关心数据透视表的一般含义。我只关注文档中的事实(https://laravel.com/docs/5.5/eloquent-relationships#many-to-many

多对多关系需要额外的表。我们还可以将其他有用的数据插入到此表中。并且可以用作系统中的模型。

实施例: 用户和角色许多一对多关系= User_roles

enter image description here

由于枢轴表的,可以检索中间表中的数据作为模型(如系统中的其他型号)。

例子:

//get user by id 
$user = App\User::find(1); 

//get roles of this user 
foreach ($user->roles as $role) { 

    //pivot attribute returns a model which represent user_role table 
    echo $role->pivot->created_at; 

} 

注意:您可以通过扩展枢创建一个类。但是你必须执行正确的关系才能使其工作。你的代码应该看起来有点类似于下面的代码。

class Student extends Model 
{ 
    /** 
    * The users that belong to the role. 
    */ 
    public function Rooms() 
    { 
     return $this->belongsToMany('App\Room')->using('App\Room_Student'); 
    } 
} 

class Room extends Model 
{ 
    /** 
    * The users that belong to the role. 
    */ 
    public function Students() 
    { 
     return $this->belongsToMany('App\Student')->using('App\Room_Student'); 
    } 
} 

class Room_Student extends Pivot 
{ 
    // 
} 

我希望这会有所帮助。

2

简单的说就是一个透视表联接两个表的表一起

说你有一个表的用户

USERS: 
user_id, user_name 

说你有一个表游戏

GAMES 
game_id, game_name 

用户可以玩很多游戏。游戏中有许多用户在玩它们。

要将它们连结你做第三个表

GAMES_TO_USERS 
game_id, user_id 

与此表,您可以要求用户玩哪些游戏,以及哪些用户玩哪个游戏。

此表GAMES_TO_USERS在这种情况下是数据透视表。

2

如果您了解多对多关系,这很常见,为了处理多对多关系,我们使用中间(透视)表来存储两个表的关系。 例如:考虑关于“教育”和“人”表,其列举如下

表:人

|------|-------|-----| 
| id | name | age | 
|------|-------|-----| 
| 1 | Bob | 30 | 
| 2 | John | 34 | 
| 3 | Marta | 28 | 
|------|-------|-----| 

表:教育

|------|-------| 
| id | level | 
|------|-------| 
| 1 | BSc | 
| 2 | MSc | 
| 3 | PhD | 
|------|-------| 

认为Bob有学士,硕士和约翰拥有BSc,MSc,PhD和Marta拥有BSc,现在这被认为是多对多的关系,为了排序这种关系,您需要有中间表,如

表:person_education

|------------|--------------| 
| person_id | education_id | 
|------------|--------------| 
| 1   | 1   | 
| 1   | 2   | 
| 2   | 1   | 
| 2   | 1   | 
| 2   | 3   | 
| 3   | 1   | 
|------------|--------------| 

该表主要存储每个关系的主键(ID)。这是枢轴表背后的基本理念,当你使用的幼虫也有一些最佳实践,比如,

  • 数据透视表的名称应包括两个 表的奇异名称,由undescore symbole和这些名字分开的应按照字母顺序排列

Laravel防爆 :

Class Person extends Model { 
    public function education() 
    { 
     return $this->belongsToMany('App\Education', 'person_education'); 
    } 
} 

此外,你可以指定数据透视表的实际字段名,如果他们不同于默认的person_id和education _id。然后,只需再添加两个参数 - 第一,目前的模式场,然后将模型的领域被连接

public function education() { 
    return $this->belongsToMany('App\Products', 'products_shops', 'shops_id', 'products_id'); 
} 
2

记住这一点

透视表 - 是用于连接表两张桌子之间的关系。


Laravel部分 - laravel提供many-to-many关系,在那里你可以使用pivot table,这是很多情况下是非常有用的。

实施例:
数据库:userspost_userposts

user.php的(型号)

class User extends Model{ 

    public function posts(){ 
    return $this->belongsToMany('Post'); 
    } 

} 

现在,来访问所有登录的用户的帖子:(视图)

@foreach(auth()->user()->posts as $post) 
    <li>{{ $post->name }}</li> 
@endforeach 

关系发生了:

记住我们有post_user表这是我们使用枢轴表。如果我们有:

1user_id,我们希望它是登录用户和1post_id234,所有这些职位将被打印出来,像这样:

|------------|--------------| 
| post_id | user_id | 
|------------|--------------| 
| 1   | 1   | 
| 2   | 1   | 
| 3   | 1   | 
| 4   | 1   | 
|------------|--------------| 

输出:

  • PostName1
  • PostName2
  • PostName3
  • PostName4