Laravel的数据透视表+一般的数据透视表

时间:2017-10-28 20:50:35

标签: php mysql laravel eloquent

一般来说,laravel数据透视表和数据透视表是什么?这是怎么回事?

最近我对Pivot表进行了研究。我以为我知道他们和他们是什么但是那时我可能错了。

我一直认为数据透视表只是两个表之间的表(多少个关系)

但后来我开始进行这项研究,而事实并非如此,而是像普通表的不同架构,其中行是列。它改变了。

但是Laravel也得到了数据透视表。开始阅读文档并进行研究。也许我读错了,但它看起来只是在laravel中的数据透视表 - 两个表之间的表,多对多。

在其他地方搜索但无法找到相关信息。

好的,就这样吧。 Laravel的支点只有很多甚至很多!

然后我开始了项目,今天我开始说这个中间表作为枢轴把我带到了一个问题,我有一个问题......分钟和小时......无法解决这一点。

模型是class Room_Student extends Pivot

解决了什么?只需将其更改为class Room_Student extends Model

我认为我不再了解数据透视表,他们是不同类型的支点吗? Laravel的支柱是不同的?

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

请帮助我理解这一点。

4 个答案:

答案 0 :(得分:14)

学习时,只关注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
{
    //
}

我希望这会有所帮助。

答案 1 :(得分:3)

简单地说就是一个数据透视表,一个将两个表连接在一起的表

说你有一个表用户

USERS:
user_id, user_name

说你有桌上游戏

GAMES
game_id, game_name

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

要链接它们,您需要制作第三张表

GAMES_TO_USERS
game_id, user_id

使用此表格,您可以请求用户玩哪些游戏,以及哪些用户玩哪种游戏。

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

答案 2 :(得分:2)

如果你知道多对多关系这很常见,为了处理多对多关系,我们使用中间(数据透视)表来存储两个表的关系。 例如:考虑下面列出的“教育”和“人”表

表:人

|------|-------|-----|
|  id  | name  | age |
|------|-------|-----|
|  1   | Bob   | 30  |
|  2   | John  | 34  |
|  3   | Marta | 28  |
|------|-------|-----|
表:教育

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

认为Bob拥有BSc,MSc和John拥有BSc,MSc,PhD和Marta拥有BSc,现在这被认为是多对多的关系,并且要对这种关系进行排序,你需要有中间表,例如,

table:person_education

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

该表主要存储每个关系的主键(ID)。这是数据透视表背后的基本思想,当你使用larval时,有一些最佳实践,例如,

  • 数据透视表的名称应包含两者的单数名称 表格,由非核心符号分隔,这些名称应该是 按字母顺序排列

Laravel Ex:

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

答案 3 :(得分: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表,它是我们使用的数据透视表。如果我们有:

user_id的{​​p> 1我们希望它是已登录的用户post_id 123,{ {1}},所有这些帖子都会打印出来:

4

<强>输出:

  • PostName1
  • PostName2
  • PostName3
  • PostName4