2015-04-21 2 views
1

я следующие модели созданы в Laravel 5 (все пространство имен в App\Models, но я удалил, что для удобства чтения):Laravel hasManyThrough и ленивым жадная загрузка

class Client extends Model { 
    public function templates() { return $this->hasMany('Template'); } 
    public function documents() { return $this->hasManyThrough('Template', 'Document'); } 
    public function users() { return $this->hasMany('User'); } 
} 

class Template extends Model { 
    public function client() { return $this->belongsTo('Client'); } 
    public function documents() { return $this->hasMany('Document'); } 
} 

class Document extends Model { 
    public function template() { return $this->belongsTo('Template'); } 
} 

В контроллере, у меня есть текущий пользователь:

$user = \Auth::user(); 
$client = $user->client; 

Я хочу, чтобы показать список

  • шаблоны для клиента
  • документы для клиента, отдельно, а не сгруппированы по шаблону

кажется достаточно легко; У меня уже есть оба необходимых отношения. Вопрос в том, что если я ленив нетерпеливую нагрузку templates и documents на $client, мне все еще нужно оперативно заряжать templates.documents (hasManyThrough) или Laravel достаточно умный, чтобы реализовать?

$client->load('templates', 'documents'); 
// or... 
$client->load('templates', 'templates.documents'); 
// or... 
$client->load('templates', 'documents', 'templates.documents'); 

ответ

0

Я только что узнал, что это possible to see if a relation is loaded, поэтому я бежал artisan tinker и испытаны:

$c = Client::first(); 
array_key_exists('documents', $c->getRelations()); // false 

// Loading `templates` and `documents` separately doesn't load `templates.documents` 
$c = Client::first(); 
$c->load('templates', 'documents'); 
array_key_exists('documents', $c->getRelations()); // true 
array_key_exists('documents', $c->templates->first()->getRelations()); // false 

// Loading `documents.templates` doesn't load `documents` or `templates` 
$c = Client::first(); 
$c->load('templates.documents'); 
array_key_exists('documents', $c->templates->first()->getRelations()); // true 
array_key_exists('documents', $c->getRelations()); // false 

Так что я предполагаю, что окончательный ответ в том, что если у вас есть hasManyThrough вы должны явно загрузить какое-либо отношение вы Доступ к - он недостаточно умен, чтобы понять, что он уже загрузил отношение для вас.

0
$client->load('templates', 'documents'); 

Должно быть хорошо. hasManyThrough - это просто ярлык - laravel попытается получить documents от client.

Вы всегда можете проверить сам - запустить оба и сравнить результаты.

+0

Мне интересно, что вы изменили свой ответ; вы сами это оценили, и если да, то вы использовали онлайн-скамью? Я просто спрашиваю, потому что я ничего не знаю о L5 – Joe

+0

На самом деле я хотел удалить его, когда я неправильно прочитал ваш вопрос (я прочитал 'hasManyThrough' как' hasMany'). Я не думаю, что есть какая-то значительная разница, поскольку документация Laravel утверждает, что это ярлык. Я не сравнивал это. –

+0

Не проверен на 'hasManyThrough', но он должен работать одинаково: если вы загружаете' 'шаблоны ',' документы ', вы можете обращаться к ним с помощью' $ client-> документов; $ Client-> templates'. Если вы загружаете '' templates.documents'', вы можете получить к ним доступ через '$ client-> templates-> documents' –

Смежные вопросы