Laravel 5 Eager Loading не работает

Я смотрю на многие результаты поиска с этой проблемой, но я не могу заставить ее работать.

Модель пользователя:

<?php namespace Module\Core\Models;

class User extends Model {

(...)

protected function Person() {
    return $this->belongsTo( 'Module\Core\Models\Person', 'person_id' );
}

(...)

И Модель личности:

<?php namespace Module\Core\Models;

class Person extends Model {

(...)

protected function User(){
    return $this->hasOne('Module\Core\Models\User', 'person_id');
}

(...)

Теперь, если я использую User::find(1)->Person->first_name, это сработает. Я могу получить отношения Persons из модели пользователя.

Но... User::with('Person')->get() завершается ошибкой с вызовом неопределенного метода Illuminate\Database\Query\Builder::Person()< /эм>

Что я делаю неправильно? мне нужна коллекция всех пользователей с информацией о них.


person Cheycron Blaine    schedule 13.03.2015    source источник
comment
Я не уверен, что это проблема, но вы должны объявить свои методы отношений как public   -  person lukasgeiter    schedule 13.03.2015
comment
и... это решение... Спасибо, lukasgeiter!   -  person Cheycron Blaine    schedule 13.03.2015


Ответы (1)


Вы должны объявить методы отношений как public.

Почему это? Давайте посмотрим на метод with():

public static function with($relations)
{
    if (is_string($relations)) $relations = func_get_args();

    $instance = new static;

    return $instance->newQuery()->with($relations);
}

Поскольку метод вызывается из статического контекста, он не может просто вызвать $this->Person(). Вместо этого он создает новый экземпляр модели и создает экземпляр построителя запросов, вызывает для него with и так далее. В конце концов, метод отношения должен быть доступен вне модели. Вот почему видимость должна быть public.

person lukasgeiter    schedule 13.03.2015