考虑以下表格:
user
id
name
client
id
name
user_client
user_id
client_id
rate
...
我希望我的控制器获取user
表中的所有字段,之后我还想列出他们的客户name
和rate
。用户和客户端模型:
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
没有型号。
我的UsersController@show
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_id
和client_id
以外的任何内容。
如何修改User::find($user->id)->clients;
以便它也会选择user_client.*
?
答案 0 :(得分:11)
如果您引用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'));
}
希望有所帮助:)