Как создать отношения следопытов, используя Полиморфные отношения Многие-Многие с Laravel?

Хорошо, поэтому я пытаюсь создать отношения, в которых пользователи могут следить за другими пользователями или следовать категориям. У меня есть рекомендация использовать отношения Polomorpic Many to Many . Прямо сейчас я пытаюсь создать отношения следопыта-последователя, но я не могу окунуться в голову, как настроить модели и контроллер.

ТАБЛИЦЫ

пользователей

Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('email'); $table->string('password'); $table->string('first_name'); }); 

категории

  Schema::create('categories', function (Blueprint $table) { $table->increments('id'); $table->string('category'); }); 

Followables

  Schema::create('followables', function (Blueprint $table) { $table->increments('id'); $table->timestamps(); $table->integer('user_id'); $table->integer('followable_id'); $table->string('followable_type'); }); 

МОДЕЛИ

пользователь

 class User extends Model implements Authenticatable { public function followers() { return $this->morphToMany('App\Followable', 'followable'); } public function following() { return $this->morphedByMany('App\Followable', 'followable'); } //Use to get id from Auth facade public function getId() { return $this->id; } } 

Followable

 class Followable extends Model { protected $fillable = ['user_id']; public function followable() { return $this->morphTo(); } } 

Соотношение сторон модели модели не существует, поэтому я оставлю это на данный момент.

КОНТРОЛЛЕР

FollowableController

 class FollowableController extends Controller { public function followUser($followable_id){ $user_id = Auth::user()->getId(); $followee = User::find($followable_id); $followee->followers()->create(['user_id' => $user_id]); return redirect()->route('get.user', ['user_id' => $followable_id]); } } 

Честно говоря, меня немного смущает код, который я создал. Это была некоторая копия и вставка без понимания 100% того, что я делаю. В любом случае, это создаст две записи в базе данных, выглядящие так:

Followable

 ------------------------------------------------- |Id | user_id | followable_id | followable_type | ------------------------------------------------- |22 | 4 | NULL | NULL | ------------------------------------------------- |23 | 0 | 22 | App\User | ------------------------------------------------- 

Функция followable_id неверна и, по-видимому, использует идентификатор, который создается в таблице Followable вместо user_id из таблицы User.

Итак, как решить, чтобы в базу данных была сохранена только одна запись с правом followable_id ?

Думаю, вы используете неправильный метод. Я сделал что-то подобное после примера документа Laravel, и morphMany() было достаточным, так как ваш User может иметь много последователей, которые сами являются user поэтому вы можете иметь:

Модель User :

 public function followers() { return $this->morphMany('App\Followable', 'followable'); } 

Затем вы можете установить user_id из контроллера (но не забудьте добавить его для заполнения).

Надеюсь, поможет 🙂