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'));
}
надеюсь, что это поможет:)