profile = $profile; self::$follower_prefix .= $profile->id; self::$following_prefix .= $profile->id; return $this; } public function followers($limit = 100, $offset = 1) { if(Redis::zcard(self::$follower_prefix) == 0) { $followers = $this->profile->followers()->pluck('profile_id'); $followers->map(function($i) { Redis::zadd(self::$follower_prefix, $i, $i); }); return Redis::zrevrange(self::$follower_prefix, $offset, $limit); } else { return Redis::zrevrange(self::$follower_prefix, $offset, $limit); } } public function following($limit = 100, $offset = 1) { if(Redis::zcard(self::$following_prefix) == 0) { $following = $this->profile->following()->pluck('following_id'); $following->map(function($i) { Redis::zadd(self::$following_prefix, $i, $i); }); return Redis::zrevrange(self::$following_prefix, $offset, $limit); } else { return Redis::zrevrange(self::$following_prefix, $offset, $limit); } } public static function follows(string $actor, string $target) { $key = self::$follower_prefix . $target; if(Redis::zcard($key) == 0) { $p = Profile::findOrFail($target); self::build()->profile($p)->followers(1); self::build()->profile($p)->following(1); return (bool) Redis::zrank($key, $actor); } else { return (bool) Redis::zrank($key, $actor); } } }