【问题标题】:Creating Follower & Following relationships in Laravel 5在 Laravel 5 中创建关注者和关注者关系
【发布时间】:2016-06-12 21:57:19
【问题描述】:

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

我还有以下表结构:

--users--
id pk

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

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

【问题讨论】:

  • 我不知道为什么你会有两个单独的表用于关注者/关注者。一张表记录谁的追随者就够了吗?
  • 不,我有一张名为 follow 的表,可以查看谁在关注谁。上表是用户表。关注者和关注字段都是用户表的外键

标签: php laravel laravel-5


【解决方案1】:

引用自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());

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

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

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

为了避免在复合键已经存在的情况下违反完整性约束。同步方式建议here

希望这会有所帮助。

【讨论】:

  • 但我需要指定主要作为我的问题状态。
  • 现在我很困惑,对不起。您有一个“跟随”数据透视表,对吗?哪一列应该是主要的,增量的?你有任何迁移代码可以分享吗?
  • 主键是follower和followee的组合。您是否认为这是一种不好的做法,只是对组合施加了独特的限制?你认为我应该把它变成一个增量吗?我会调查你的答案。感谢您给我一些代码来扩展 btw。我真的很感激
  • 哦,抱歉,现在我明白了,您当然也可以使用复合键。虽然我无法判断哪个是更好的做法。也许是其他人?无论如何,我会相应地编辑我的答案。
  • 非常感谢您的回答。属于ToMany 是我正在寻找的:D。我特别受益于你的 self::class 命令。
猜你喜欢
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 2013-10-02
  • 2019-06-18
  • 2014-01-06
  • 2015-10-26
  • 2017-07-01
相关资源
最近更新 更多