创造追随者&跟随Laravel 5的关系

时间:2016-02-29 18:21:54

标签: php laravel laravel-5

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

我还有以下表结构:

--users--
id pk

--follows--
follower pk,fk
following pk,fk

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

1 个答案:

答案 0 :(得分:4)

引用docs

  

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

您应该能够传递您所知的自定义外键列名称。

- 编辑: 经过一番反思后,我认为hasManyThrough不足以满足您的目标(至少在问题中提供的信息很少)。相反,belongsToMany应该:

在新的Laravel 5.2安装中,我为此类数据透视表创建了迁移(受另一个post的启发):

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

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

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

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

在这个(普通)示例的第一个版本中,有两个主键:'users'上的'id'和'follow'上的'id',即按惯例的默认值。您可以在模型中覆盖您的pk,如protected $primaryKey = 'user_id';。 SO上有一个post。 现在数据透视表有一个复合键,它必须是唯一的,这就是我想的OP意图。

- 编辑2: 有了约束,你应该像这样添加关注者:

$user->followers()->sync([$anotherUser->id],false);

如果组合密钥已经存在,则为了避免完整性约束违规。建议使用同步方法here

希望这有帮助。