2017-08-02 19 views
2

我与雄辩的关系混淆。我有两个表:Laravel用户与朋友的雄辩关系

USERS: 
id, name, pwd, etc... 

FRIENDS: 
id, user_id, friend_id 

对于FRIENDS表,我有两个外键:

$t->foreign('user_id') 
    ->references('id') 
    ->on('users'); 

$t->foreign('friend_id') 
    ->references('id') 
    ->on('users'); 

在每一节课,我有以下关系:

USER类:

/** 
* A user can have many friends 
*/ 
public function friends() 
{ 
    return $this->hasMany(User::class, 'friend_id', 'id'); 
} 

FRIEND类别:

/** 
* A friend can belong to a user 
*/ 
public function friend() 
{ 
    return $this->belongsTo(User::class, 'id', 'user_id'); 
} 

/** 
* A user friends are connected to 
*/ 
public function user() 
{ 
    return $this->belongsTo(User::class, 'id', 'friend_id'); 
} 

我想

Auth::user()->friends()->get(); 

落得应的关系是hasManyThrough()?如何在USERS表通过FRIENDS表自引用时实现这一点?

+0

首先,为什么你在朋友表 – Didi

+0

@Didi一个friend_id,其支点。我敢打赌,他只需要删除数据透视表中的'id'。 @TheRealPapa,我不认为你需要'hasManyThrough()',因为这是一个直接的多对多关系。 –

+0

是的,你不需要hasManyThrough()。 – Didi

回答

1

迁移:

public function up() 
{ 
    Schema::create('friend_user', function(Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('friend_id')->unsigned()->index(); 
     $table->integer('user_id')->unsigned()->index(); 
     $table->foreign('friend_id')->references('id')->on('users')->onDelete('cascade'); 
     $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 
    }); 
} 

用户模式:

public function friends() 
{ 
    return $this->belongsToMany(User::class, 'friend_user', 'user_id', 'friend_id'); 
} 

UPDATE

获取所有的朋友:

Auth::user()->friends (or Auth::user()->friends()->get()) 

添加FR iends:

Auth::user()->friends()->attach([2,3,4]); // Add user_id 2, 3 and 4 

删除好友:

Auth::user()->friends()->detach([2]); // Remove user_id = 2 

同步的朋友:

Auth::user()->friends()->sync([7]); // Remove old and add user_id = 7 
+0

没有朋友类需要 –

+0

我想我错过了你的答案中的东西:如果它是一个多对多的关系,那么就有'用户表','朋友'表和数据透视表'friend_user'......但是什么如果关系存储在数据透视表中,是否包含'friends'表? –