【问题标题】:Laravel's pivot table + Pivot table in generalLaravel 的数据透视表 + 数据透视表
【发布时间】:2018-04-10 04:46:58
【问题描述】:

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

最近我对数据透视表进行了研究。我以为我了解它们以及它们是什么,但后来我可能错了。

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

但后来我开始了这项研究,结果碰巧不是那样,而是类似于普通表的不同架构,其中行是列。变了。

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

在别处搜索,但找不到有关它的适当信息。

好吧,就这样吧。 Laravel 的支点只是多对多!

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

型号是class Room_Student extends Pivot

解决方法是什么?只需将其更改为class Room_Student extends Model。

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

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

请帮助我理解这一点。

【问题讨论】:

  • 我找到了有关数据透视表和 laravel 的详细说明。它值得一试。 laraveldaily.com/pivot-tables-and-many-to-many-relationships
  • 数据透视表只是一个附加表,可能会在 2 个数据模型之间建立多对多关系时出现。这只是所有使用数据库以将数据相互连接并密切关注所有这些最佳实践规则的人发现的一种方式。这可能是目前最好的方法。我们将看看这是否会在未来发生变化。这种方法只需要索引,如果你研究过数据库,这是一种非常快速的数据查找方法。
  • "关联表俗称很多,包括关联表、桥接表、交叉引用表 , 人行横道, 中间表, 交叉点表, 连接表, 联结表, 链接表、链接表、多对多解析器、映射表、映射表、pairing table、pivot table(在 Laravel 中使用 - 不要与 pivot table (spreadsheets) 混淆)或 transition table。 " - en.wikipedia.org/wiki/Associative_entity

标签: php mysql laravel eloquent


【解决方案1】:

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

多对多关系需要一个额外的表。我们也可以在这个表中插入其他有用的数据。并且可以作为系统中的模型使用。

示例: 用户和角色多对多关系 = User_roles

由于数据透视表,您可以将中间表数据作为模型检索(与系统中的其他模型一样)。

例子:

//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;

}

注意:您可以通过扩展 pivot 来创建一个类。但是您必须实施正确的关系才能使其发挥作用。您的代码应该类似于下面的代码。

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
{
    //
}

我希望这会有所帮助。

【讨论】:

  • 认为数据透视表应该命名为 role_user,因为它们需要按字母顺序排列...
  • 如果您的表有多个多对多关系怎么办? Eloquent 会选择它找到的第一个吗?
【解决方案2】:

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

假设你有一个表 users

USERS:
user_id, user_name

说你有桌游

GAMES
game_id, game_name

一个用户可以玩很多游戏。游戏有很多用户在玩。

要链接它们,您需要创建第三张表

GAMES_TO_USERS
game_id, user_id

使用此表,您可以查询用户玩哪些游戏,以及哪些用户玩哪些游戏。

此表GAMES_TO_USERS 在本例中是数据透视表。

【讨论】:

    【解决方案3】:

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

    表:人

    |------|-------|-----|
    |  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,现在这被视为多对多关系,并且要对这种关系进行排序,您需要有中间表,例如,

    表:person_education

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

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

    • 数据透视表的名称应由两者的单数名称组成 表,由 undecore 符号分隔,这些名称应该是 按字母顺序排列

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

    【讨论】:

      【解决方案4】:

      记住这一点

      数据透视表 — 是用于连接两个表之间关系的表。


      Laravel 部分——laravel 提供many-to-many 关系,你可以使用pivot table,它在很多情况下都非常有用。

      示例:
      数据库: users、post_user、posts

      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 表,这是我们使用的数据透视表。如果我们有:

      1 的user_id 和我们期望它是登录用户和1、2、2、3、4 的post_id,所有这些帖子都会像这样打印出来:

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

      输出:

      • 职位名称1
      • 职位名称2
      • 职位名称3
      • 职位名称4

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-15
        • 2021-08-17
        • 1970-01-01
        • 2015-09-10
        • 2014-08-24
        • 2019-07-09
        • 2016-12-06
        • 2016-12-26
        相关资源
        最近更新 更多