Полиморфизм многих ко многим из пользователей в сообщения и категории

Мне нужно внедрить систему слежения, такую ​​как твиттер, но за исключением пользователя, он может следить за многими 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');
}

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

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

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

2

Решение

Ты можешь использовать 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 оба трансформировались от многие и трансформировались в многие, создавая самореференции отношения многих ко многим.

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]