Объедините два результата полиморфных отношений

#laravel #laravel-4 #eloquent

#laravel #laravel-4 #красноречивый

Вопрос:

Из документации Laravel — если у меня есть это полиморфное отношение «многие ко многим»:

 class Tag extends Eloquent {

    public function posts()
    {
        return $this->morphedByMany('Post', 'taggable');
    }

    public function videos()
    {
        return $this->morphedByMany('Video', 'taggable');
    }

}
  

Итак, я могу сделать это:

 $tag = Tag::find(1);
$posts = $tag->posts;
$videos = $tag->videos;
  

Как я мог бы получить все отношения тегов как один результат? т. Е. в полиморфном отношении «один ко многим» вы делаете это:

 $tag = Tag::find(1);
$taggable = $tag->taggable;
  

Но, похоже, это не работает для меня в отношениях «многие ко многим» — я получаю эту ошибку SQL:

SQLSTATE[42S22]: столбец не найден: 1054 неизвестных столбца ‘tag_groups.’ в предложении ‘where’ (SQL: select * from tag_groups where tag_groups .` является нулевым пределом 1)

Комментарии:

1. Какой результат вы ожидаете? Красноречивая коллекция — это скорее не тот путь, поскольку у вас могут быть дубликаты ключей.

Ответ №1:

Вам придется объединить результаты самостоятельно:

 $taggable = $tag->posts->toBase()->merge($tag->videos);
  

Это вернет экземпляр IlluminateSupportCollection .

Красноречивая коллекция не имеет смысла в этом контексте.

Ответ №2:

Вы не можете получить все отношения в одном результате, но вы можете с готовностью загрузить их все, используя что-то вроде этого:

 $tag = Tag::with(['posts', 'videos'])->find(1);
$relations = $tag->getRelations();
  

Here $tag->getRelations() вернет массив загруженных отношений, так что вы можете получить к нему доступ, используя что-то вроде этого:

 $posts = $relations['posts']; // Collection of Post models
$videos = $relations['videos']; // Collection of Video models
  

Вы можете объединить их следующим образом:

 $allRelations = array_merge($posts->toArray(), $videos->toArray());
  

Или с помощью merge метода IlluminateSupportCollection (как Joseph Silber уже упоминалось)

 $allRelations = $relations['posts']->toBase()->merge($relations['videos']);