Привет, ребята. Я новичок в Laravel 4 PHP Framework и знаю немного. Просто хочу спросить, как стремиться загрузить 3 таблицы (или более) и дать представление о чистом способе доступа к переменной (у меня есть таблица пользователей, профиль и статусы)
**Users Table**
id (int) ai
code (varchar)
email_id (int) ref to email table
username (varchar)
password (varchar)
softdeletes, timestamps, remember token laravel defaults
**Profile Table**
id (int) ai
user_id (int) index ref to users table
lastname (varchar)
firstname (varchar)
middlename (varchar)
birthdate (date)
and more...
laravel defaults...
**Statuses Table**
id (int) ai
user_id (int) index ref to users table
message (text)
laravel defaults...
Модель пользователя предоставлена laravel. Я просто добавляю профиль публичной функции и статусы.
<?php
class User extends \Eloquent {
......
public function profile()
{
return $this->hasOne('Profile');
}
public function statuses()
{
return $this->hasMany('Status');
}
}
Модель профиля и статусов
class Profile extends \Eloquent {
public function user()
{
return $this->belongsTo('User');
}
}
class Status extends \Eloquent {
public function user()
{
return $this->belongsTo('User');
}
}
В моем методе индекса HomeController я объявил переменную $ user следующим образом.
$user = User::with('profile', 'statuses')->whereId( Auth::id() )->first();
$statuses = $user->statuses;
Затем я сжимаю статусы на мой взгляд, а затем запускаю
@foreach($statuses as $status)
{{ $status->user->profile->firstname; }}
{{ $status->message; }}
@endforeach
Но я получаю ошибку.
Спасибо 🙂
Вам нужно знать, что красноречивый отношения не являются двунаправленными.
Как говорится, загрузка statuses
на users
не загружается user
на каждой status
:
$user = User::with('statuses')->first();
// query users table once and statuses table once
// now you can use statuses:
$user->statuses; // collection
$user->statuses->first(); // single status
НО это совершенно другая история
$user->statuses->first()->user;
// query users table for the user of this status
// despite you already loaded that user and stored in $user variable
// in your case you did that in your loop:
@foreach($statuses as $status)
{{ $status->user->profile->firstname; }}
// here you query users table AND profiles table again
Поэтому, если вы сделаете это в цикле foreach, вы получите столько запросов, сколько есть состояний в коллекции.
Теперь самый простой и выразительный способ для вас был бы таков:
// controller
$user = Auth::user()->load('statuses', 'profile');
// the same as User::with('statuses', 'profile')->where('id', Auth::id())->first();
return View::make('some.view', compact('user'));
Тогда по вашему мнению:
@foreach ($user->statuses as $status)
// you can access the user, not affected by the loop
$user->username
// you can access the profile, not affected by the loop
$user->profile->firstname
// and of course each status in the loop
$status->message
@endforeach
Если я понимаю в представлении Blade, вы должны использовать:
{{ $user->profile->firstname }} {{ $user->profile->lastname }}
@foreach ($user->statuses as $status)
{{ $status->message }} {{ $status->id}}
@endforeach
получить все статусные сообщения и идентификаторы для выбранного пользователя.
РЕДАКТИРОВАТЬ
Поскольку вы добавили больше кода, вы должны назначить на ваш $user
а также $statuses
переменные.
Теперь вы можете сделать:
@foreach ($statuses as $status)
{{ $user->profile->firstname }} {{ $user->profile->lastname }}
{{ $status->message }}
@endforeach
потому что каждый пользователь будет одинаковым для этих сообщений (вы получили от пользователя базы данных с выбранным идентификатором)
Но вы можете только назначить $user
на ваш взгляд и следующий код должен работать:
@foreach ($user->statuses as $status)
{{ $user->profile->firstname }} {{ $user->profile->lastname }}
{{ $status->message }}
@endforeach
Как я могу получить имя и фамилию пользователя, которые имеют статусы
связаны с там идентификаторами
Тогда вы можете попробовать это (Обратите внимание, User::has('statuses')
, который получат пользователи только у кого есть statuses
):
$user = User::has('statuses')
->with('profile', 'statuses')
->whereId(Auth::id())
->first();
Без has('statuses')
вы получите всех пользователей, даже если они не имеют связанных статусов. Тогда в вашем view
:
{{ $user->profile->firstname }}
{{ $user->profile->lastname }}