Я пытаюсь получить массив всех ассоциаций моей модели. У меня есть следующая модель:
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-> отношения, используемые для того, чтобы не хранить модельные отношения? Есть ли способ, которым я могу получить массив отношений моей модели автоматически?
Это невозможно, потому что отношения загружаются только тогда, когда они запрашиваются либо с помощью (для активной загрузки), либо с использованием общедоступного метода отношений, определенного в модели, например, если модель 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(); }