Хорошо, поэтому я пытаюсь создать отношения, в которых пользователи могут следить за другими пользователями или следовать категориям. У меня есть рекомендация использовать отношения 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 из контроллера (но не забудьте добавить его для заполнения).
Надеюсь, поможет 🙂