如何实施一元多对多与Eloquent模型的关系
例如:如果有用户可以向一个或多个用户发送请求朋友的关系
我知道我必须创建新模型,例如用户请求用户,新模型的主键将是[ user1_id,user2_id ]这就是我的想法
但是如何实现这种关系..
答案 0 :(得分:1)
是的,亲爱的,就像普通的多对多关系一样,但有一点点差别。 多对多关系的第一步是创建数据透视表,以便为数据透视表创建迁移。数据透视表属于正常多对多关系的两个表,但是这个数据透视表属于一个表。如果创建数据透视表名称“friend_request_user”,那么这里是迁移
public function up()
{
Schema::create('friend_request_user', function(Blueprint $table)
{
$table->integer('user_id')->unsigned()->index();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->integer('request_user_id')->unsigned()->index();
$table->foreign('request_user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
}
现在你应该有两个模型,一个是“User”,另一个是你已经拥有“user-request-user”。两个模型都应该指向同一个表,即“用户”。默认情况下,用户模型指向用户表,但是您为“user-user-user”模型指向“users”表编写了一个属性$ table,所以
protected $table = 'users';
在用户模型中,您只需编写一个简单的方法,就可以写入任何其他多对多关系......所以
public function request(){
return $this->belongsToMany('App\user-request-user', 'friend_request_user','user_id', 'request_user_id');
}
“belongsToMany”函数的第一个参数是关系模型,第二个是数据透视表名,第三个是外键,第四个是数据透视表中的其他键使用。我们编写这些参数只是因为在这种情况下不遵循laravel语法。这就是全部,现在只需将此函数称为
Auth::user()->request;
您可能还想使用可以在其他模型“user-request-user”上书写的功能相反,但这只是为了您的需要。
public function nameOfFunction(){
return $this->belongsToMany('App\User', 'friend_request_user', 'request_user_id', 'user_id');
}