与Eloquent模型实现一元多对多关系[Laravel]

时间:2015-02-05 20:48:44

标签: database laravel relational-database models

如何实施一元多对多与Eloquent模型的关系

例如:如果有用户可以向一个或多个用户发送请求朋友的关系

我知道我必须创建新模型,例如用户请求用户,新模型的主键将是[ user1_id,user2_id ]这就是我的想法

但是如何实现这种关系..

1 个答案:

答案 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');
}