Laravel: belongsToMany() не получает полей в таблице " многие ко многим

рассмотрим следующие таблицы:

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.* так же?

EDIT: пока я на нем, любые предложения по улучшению также приветствуются.

1 ответов


если вы ссылаетесь на Laravel docs на сводных таблицах, вам необходимо добавить 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'));
}

надеюсь, что это поможет:)