2014-01-15 50 views
5

考慮以下表獲得域:Laravel:belongsToMany()不會在許多一對多表

user 
    id 
    name 

client 
    id 
    name 

user_client 
    user_id 
    client_id 
    rate 
    ... 

我希望我的控制器到達各個領域的user表,我也想列出之後他們的客戶namerate。用戶和客戶端型號:

class User extends Eloquent { 

    public function clients() 
    { 
     return $this->belongsToMany('Client', 'user_client'); 
    } 

} 

class Client extends Eloquent { 

    public function users() 
    { 
     return $this->belongsToMany('User', 'user_client'); 
    } 

} 

user_client沒有型號。

[email protected]

public function show($username) // foo.com/user/{$username} 
{ 
    $user = User::where('username', '=', $username)->firstOrFail(); 
    $clients = User::find($user->id)->clients; 

    return View::make('users.show', compact('user', 'clients')); 
} 

提取物雖然這運行正常,讓我們來看看在視圖users/show.blade.php

<h1>{{$user->name}}</h1> 
@foreach($clients as $client) 
    <p>{{$client->name}}, {{$client->rate}}</p> 
@endforeach 

$client->rate是不確定的。檢查我的查詢調試器,belongsToMany將只選擇client.*,但它不會選擇除user_idclient_id之外的其他任何內容。

如何修改User::find($user->id)->clients;以便它也會選擇user_client.*

編輯:雖然我在它,任何改進建議也歡迎。

回答

10

如果您參考laravel docs on pivot tables,則需要在關係上添加withPivot

在你的榜樣,您需要添加以下內容:

class User extends Eloquent 
{ 

    public function clients() 
    { 
     return $this->belongsToMany('Client', 'user_client')->withPivot('rate'); 
    } 
} 

更新您的看法一樣:

<h1>{{$user->name}}</h1> 
@foreach($user->clients as $client) 
    <p>{{$client->name}}, {{$client->pivot->rate}}</p> 
@endforeach 

我也渴望負荷的客戶節省您的時間:

public function show($username) // foo.com/user/{$username} 
{ 
    $user = User::with('clients')->where('username', '=', $username)->firstOrFail(); 

    return View::make('users.show', compact('user')); 
} 

希望幫助:)

+0

哇,這相當不錯,尤其是熱切的加載。查看文檔,但我將如何使用公共函數newPivot(Model $ parent,array $ attributes,$ table,$ exists) \t { \t \t返回新的UserClient($ parent,$ attributes,$ table,$ exists) ; \t}'在這種情況下?我添加了一個'BaseModel'來擴展Eloquent,但是我很難理解這個概念。 – tiffanyhwang

+0

我可以建議你在論壇或IRC中採取這一做法嗎?不確定你想要達到什麼目的? :) – Cristian

+0

感謝' - > pivot->'提示。 – Pathros