2017-10-28 301 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