Laravel:belongsToMany()不会在多对多表中获取字段

时间:2014-01-15 15:10:27

标签: laravel many-to-many

考虑以下表格:

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没有型号。

我的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_idclient_id以外的任何内容。

如何修改User::find($user->id)->clients;以便它也会选择user_client.*

编辑:虽然我很喜欢,但也欢迎任何改进建议。

1 个答案:

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

希望有所帮助:)