在 Laravel 5 中创建关注者和关注者关系

ala*_*udi 0 php laravel laravel-5

我试图在 Laravel 中创建一个函数,它将通过 Laravel 的动态属性返回所有用户的关注者。它应该是这个样子:$user->followers

我还有以下表结构:

--users--
id pk

--follows--
follower pk,fk
following pk,fk
Run Code Online (Sandbox Code Playgroud)

我试图在模型中使用 hasManyThrough 函数,但我在文档中看到了一个示例,该示例允许我指定除增量 id 之外的自定义主键。

mac*_*air 6

引用文档

如果您想自定义关系的键,您可以将它们作为第三个和第四个参数传递给hasManyThrough 方法。第三个参数是中间模型上的外键名称,而第四个参数是最终模型上的外键名称。

您应该能够按照那里的描述传递您的自定义外键列名称。

--编辑:经过一些反思,我认为hasManyThrough对于您想要实现的目标来说还不够(至少在问题中提供的信息很少)。相反belongsToMany应该这样做:

在全新的 Laravel 5.2 安装中,我为这样的数据透视表创建了一个迁移(受另一篇文章的启发):

 public function up()
 {
     Schema::create('follows', function (Blueprint $table) {
         // Edit 2 without an incremental id
         // $table->increments('id');
         $table->integer('follower_id')->unsigned();
         $table->integer('followee_id')->unsigned();
         $table->foreign('follower_id')->references('id')
               ->on('users')
               ->onDelete('cascade');
         $table->foreign('followee_id')->references('id')
               ->on('users')
               ->onDelete('cascade');

         // Edit 2: with primary and unique constraint
         $table->primary(['follower_id', 'followee_id']);
         $table->unique(['follower_id', 'followee_id']);
     });
 }
Run Code Online (Sandbox Code Playgroud)

App\User模型中

public function followers()
{
    return $this->belongsToMany(
        self::class, 
        'follows',
        'followee_id',
        'follower_id'
    );
}
public function followees()
{
    return $this->belongsToMany(
        self::class,
        'follows',
        'follower_id',
        'followee_id'
    );
}
Run Code Online (Sandbox Code Playgroud)

然后,在播种一些用户和枢轴关系之后,这对我有用:

$user = User::first();
// user is followed by
echo json_encode($user->followers()->get());
// user is following
echo json_encode($user->followees()->get());
Run Code Online (Sandbox Code Playgroud)

在这个(简单的)例子的第一个版本中,有两个主键:“users”上的“id”和“follows”上的“id”,即约定俗成的默认值。您可以像这样覆盖模型中的 pk protected $primaryKey = 'user_id';。有一个关于这个的帖子。现在数据透视表有一个复合键,它必须是唯一的,我猜这是 OP 的意图。

- 编辑 2:在约束到位后,您应该像这样添加关注者:

$user->followers()->sync([$anotherUser->id],false);
Run Code Online (Sandbox Code Playgroud)

如果组合键应该已经存在,则为了避免违反完整性约束。此处建议使用同步方法。

希望这可以帮助。