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