Laravel: извлечение всех отношений из отношения многие ко многим (Polymorphi c) - PullRequest
0 голосов
/ 26 января 2020

У меня есть классические полиморфные отношения «многие ко многим» c.

Например, у меня есть две модели Post и Video. Модели могут быть помечены с моделью Tag. Tag может принадлежать многим Post с и / или Video с. И Post (Video) может иметь несколько Tag с.

Теперь я хочу получить все подключенные модели (Post с И Video с) для одного тега.

Я знаю, что могу сделать $videos = $tag->videos, но тогда я получаю только видео. Я хочу сделать что-то вроде $models = $tag->getAllConnectedModels(), чтобы получить массив всех Post s и Video s. Как я могу это сделать?


Вот определения моделей

class Post extends Model
{
    public function tags()
    {
        return $this->morphToMany('App\Tag', 'taggable');
    }
}

class Video extends Model
{
    public function tags()
    {
        return $this->morphToMany('App\Tag', 'taggable');
    }
}


class Tag extends Model
{
    public function posts()
    {
        return $this->morphedByMany('App\Post', 'taggable');
    }
    public function videos()
    {
        return $this->morphedByMany('App\Video', 'taggable');
    }
}

1 Ответ

0 голосов
/ 26 января 2020

Вы можете создать этот метод в своей модели тегов,

И использовать merge в коллекции:

 public function getAllConnectedModels()
 {
    return $this->posts->merge($this->videos);
 }

Так что, когда вы вызываете $tag->getAllConnectedModels(), он возвращает что-то вроде это:

=> Illuminate\Database\Eloquent\Collection {#33740
     all: [
       App\Post {#2984
         id: 1,
         ...
       },
       App\Video {#8999
         id: 3,
         ...
       },
     ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...