Получить массив отношений модели Eloquent

Я пытаюсь получить массив всех моих ассоциаций моделей. У меня есть следующая модель:

class Article extends Eloquent {
    protected $guarded = array();

    public static $rules = array();

    public function author() {
        return $this->belongsTo('Author');
    }

    public function category() {
        return $this->belongsTo('Category');
    }
}

Из этой модели я пытаюсь получить следующий массив своих отношений:

array(
    'author',
    'category'
)

Я ищу способ вывести этот массив из модели автоматически.

Я нашел это определение метода отношений toArray на модели Eloquent, который, как представляется, возвращает массив модельных отношений. Кажется, он использует атрибут $this- > relations модели Eloquent. Однако этот метод возвращает пустой массив, а атрибут отношений - пустой массив, несмотря на правильное установление отношений.

Что такое $this- > отношения, используемые, если не хранить модельные отношения? Есть ли способ, которым я могу автоматически получить массив моих отношений модели?

Ответ 1

Это невозможно, потому что отношения загружаются только при запросе либо с помощью with (для активной загрузки), либо с использованием общедоступного метода отношений, определенного в модели, например, если создана модель Author со следующим соотношением

public function articles() {
    return $this->hasMany('Article');
}

Когда вы вызываете этот метод, например:

$author = Author::find(1);
$author->articles; // <-- this will load related article models as a collection

Кроме того, как я сказал with, когда вы используете что-то вроде этого:

$article = Article::with('author')->get(1);

В этом случае первая статья (с идентификатором 1) будет загружена связанной с ней моделью Author, и вы можете использовать

$article->author->name; // to access the name field from related/loaded author model

Таким образом, невозможно получить отношения магически без использования соответствующего метода для загрузки отношений, но как только вы загрузите связь (связанные модели), вы можете использовать что-то вроде этого, чтобы получить отношения:

$article = Article::with(['category', 'author'])->first();
$article->getRelations(); // get all the related models
$article->getRelation('author'); // to get only related author model

Чтобы преобразовать их в array, вы можете использовать метод toArray(), например:

dd($article->getRelations()->toArray()); // dump and die as array

Метод relationsToArray() работает с моделью, которая загружается с помощью связанных моделей. Этот метод преобразует связанные модели в форму массива, где метод toArray() преобразует все данные модели (с отношением) в массив, вот исходный код:

public function toArray()
{
     $attributes = $this->attributesToArray();

     return array_merge($attributes, $this->relationsToArray());
}

Он объединяет атрибуты модели и связанные атрибуты модели после преобразования в массив и возвращает его.

Ответ 2

используйте это:

class Article extends Eloquent 
{
    protected $guarded = array();

    public static $rules = array();

    public $relationships = array('Author', 'Category');

    public function author() {
        return $this->belongsTo('Author');
    }

    public function category() {
        return $this->belongsTo('Category');
    }
}

Итак, вне класса вы можете сделать что-то вроде этого:

public function articleWithAllRelationships()
{
    $article = new Article;
    $relationships = $article->relationships;
    $article = $article->with($relationships)->first();
}