2014-02-06 4 views
10

Я пытаюсь получить массив всех ассоциаций моей модели. У меня есть следующие модели:Получить массив отношений модели 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' 
) 

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

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

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

ответ

17

Это невозможно потому, что отношения загружаются только при запросе либо с помощью 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()); 
} 

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

+1

я вижу!Очень полезно, спасибо большое :) – tprsn

+0

Мне НУЖНА НЕПОСРЕДСТВЕННАЯ ПОМОЩЬ. '' ' Слово :: где ("слово", "любовь") -> с ("чувств") -> получить() -> срывать ('чувства') -> ToArray(); '' ' В этом примере, приведенном выше, при условии, что каждое Слово принадлежит ToMany Sense и что каждое Sense принадлежит многим синонимам. Как я могу получить синонимы с чувствами? –

+0

«Word :: where (« word »,« love ») -> with (" senses. Synonyms ") -> get() -> pluck ('senses. Synonyms') -> toArray()' –

1

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

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(); 
} 
Смежные вопросы