Мне нужно внедрить систему слежения, такую как твиттер, но за исключением пользователя, он может следить за многими 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
но я не могу обернуть голову вокруг этого.
Пожалуйста, помогите, как я могу упростить это. еще раз ниже требования
Ты можешь использовать 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;
к новой сущности, которую вы добавляете.
Других решений пока нет …