2017-02-13 21 views
0

Хорошо, поэтому я пытаюсь создать отношения, в которых пользователи могут следить за другими пользователями или следовать категориям. Я получил рекомендацию использовать отношения Polomorpic Many to Many. Сейчас я пытаюсь создать привязку - followee, но я не могу окунуться в голову, как настроить модели и контроллер.Как создать отношения следопытов, используя Полиморфные отношения Многие во многих отношениях с Laravel?

ТАБЛИЦЫ

Пользователи

 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(); 
    } 

} 

Отношение модель последователь Категории еще не существует, так что я оставлю, что один из сейчас.

CONTROLLER

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 является неправильно и, кажется, использует Id, который создается в Followable таблице вместо user_id из таблицы User.

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

+0

У вас возникло это исправление? –

+0

Я предполагаю, что на этот раз вам нужно явно добавить его в функцию 'follower()' relationship в модели User, то есть 'return $ this-> morphMany ('App \ Followable', 'followable', null, 'followable_id'); ' –

ответ

0

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

User модель:

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

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

Надеюсь, это поможет :)

+0

Ничего не сохраняется в базе данных при попытке этого. Есть ли что-то большее, что я должен изменить? –

+0

@AdamDedanga, вы уверены, что у вас есть правильное поле в качестве внешнего ключа для этих таблиц. И смогли ли вы найти решение? –