Laravel 4 Eager Загрузка нескольких столов и легкий доступ к представлению

Привет, ребята. Я новичок в 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

Но я получаю ошибку.

Спасибо 🙂

0

Решение

Вам нужно знать, что красноречивый отношения не являются двунаправленными.

Как говорится, загрузка 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
0

Другие решения

Если я понимаю в представлении 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
0

Как я могу получить имя и фамилию пользователя, которые имеют статусы
связаны с там идентификаторами

Тогда вы можете попробовать это (Обратите внимание, User::has('statuses'), который получат пользователи только у кого есть statuses):

$user = User::has('statuses')
->with('profile', 'statuses')
->whereId(Auth::id())
->first();

Без has('statuses') вы получите всех пользователей, даже если они не имеют связанных статусов. Тогда в вашем view:

{{ $user->profile->firstname }}
{{ $user->profile->lastname }}
0