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