Полиморфные многие для многих от пользователя до публикации и категории

Мне нужно реализовать следующую систему, например, твиттер, но с исключением, что пользователь может следить за множеством Post и может следовать за всей Category или пользователь может следовать за User .

Я придумал эти отношения. Я использую Laravel 5.1

Модель пользователя

 public function followers() { return $this->belongsToMany('App\User', 'user_follows', 'user_id', 'follow_id'); } public function follows() { return $this->belongsToMany('App\User', 'user_follows', 'follow_id', 'user_id'); } 

и для последующей категории

Категория Модель

 public function followers() { return $this->belongsToMany('App\User', 'category_follows', 'user_id', 'category_id'); } 

и для Post – это то же самое, как вы можете видеть, мне нужно 3 таблицы (user_follows, category_follows, post_follows) чтобы сделать эту работу.

Я знаю, что есть Polymorphic Relation но я наклоняю вокруг себя. Пожалуйста, помогите, как я могу это упростить. еще раз ниже требования

  • Пользователь может следить за многими сообщениями
  • Пользователь может следить за многими категориями
  • Пользователь может следить за многими пользователями

    Вы можете использовать morphedByMany для создания полиморфных отношений многих и многих . Вместо отдельных таблиц *_follows вы можете иметь одну followables таблицу со следующей схемой:

     user_id int # user_id that is following something followable_id int # id of the thing that is being followed followable_type string # type of the thing that is being followed 

    Вот пример реализации:

    Категория, почта и пользовательские модели

     /* * This function gets the followers of this entity. The * followable_id in the followables relation would be * the id of this entity. */ function followers() { return $this->morphToMany('App\User', 'followable'); } 

    Модель пользователя

     /* * Gets the list of users that are followed by this user. */ function users() { return $this->morphedByMany('App\User', 'followable'); } /* * Gets the list of posts that are followed by this user. */ function posts() { return $this->morphedByMany('App\User', 'followable'); } /* * Gets the list of categories that are followed by this user. */ function categories() { return $this->morphedByMany('App\User', 'followable'); } 

    Обратите внимание, что в этом случае User оба превращается во многих и преобразуется ко многим, создавая саморегуляцию от многих до многих отношений.

    Каждый новый последующий объект, который вы создаете, вам нужно будет добавить функцию followers() к этому объекту и соответствующее обратное отношение к объекту Users . Вы можете определить Followable содержащий эту функцию, и просто добавить use Followable; к добавляемой новой сущности.