Итак, я пытаюсь создать отношения, где пользователи могут следовать за другими пользователями или следовать категориям. Я получил рекомендацию использовать Polomorpic Много ко многим отношения. Прямо сейчас я пытаюсь создать последователь — последователь отношения, но я не могу обдумать, как настроить модели и контроллер.
ТАБЛИЦЫ
пользователей
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.
Итак, как решить, чтобы было сохраняется только одна запись в базу данных с right followable_id?
Я полагаю, вы используете неправильный метод. Я сделал что-то подобное, следуя примеру доктора Ларавела, и morphMany()
было достаточно, так как ваш User
может иметь много последователей, которые сами user
так что вы можете иметь:
User
модель:
public function followers()
{
return $this->morphMany('App\Followable', 'followable');
}
Затем вы можете установить user_id из контроллера (но не забудьте добавить его в fillable).
Надеюсь, поможет 🙂
Других решений пока нет …