Получить массив отношений модели 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-> отношения, используемые для того, чтобы не хранить модельные отношения? Есть ли способ, которым я могу получить массив отношений моей модели автоматически?

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

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

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

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

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

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

 $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()); } 

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

использовать это:

 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(); }