jcc/laravel-vote

The package helps you to add user based vote system to your model
51,344 133
Install
composer require jcc/laravel-vote
Latest Version:v2.0.0
PHP:>=7.2
Laravel:5 – 8
License:MIT
Last Updated:Jun 7, 2023
Links: GitHub  ·  Packagist
Maintainer: jcc

Laravel Vote System

:tada: This package helps you to add user based vote system to your model.

Installation

You can install the package using Composer:

$ composer require "jcc/laravel-vote:~2.0"

Then add the service provider to config/app.php:

Jcc\LaravelVote\VoteServiceProvider::class

Publish the migrations file:

$ php artisan vendor:publish --provider="Jcc\LaravelVote\VoteServiceProvider" --tag="migrations"

Finally, use VoteTrait in User model:

use Jcc\LaravelVote\Traits\Voter;

class User extends Model
{
    use Voter;
}

Or use CanBeVoted in Comment model:

use Jcc\LaravelVote\Traits\Votable;

class Comment extends Model
{
    use Votable;
}

Usage

For User model

Up vote a comment or comments
$comment = Comment::find(1);

$user->upVote($comment);

Down vote a comment or comments

$comment = Comment::find(1);

$user->downVote($comment);
Cancel vote a comment or comments
$comment = Comment::find(1);

$user->cancelVote($comment);
Get user has voted comment items
$user->getVotedItems(Comment::class)->get();
Check if user has up or down vote
$comment = Comment::find(1);

$user->hasVoted($comment);
Check if user has up vote
$comment = Comment::find(1);

$user->hasUpVoted($comment);
Check if user has down vote
$comment = Comment::find(1);

$user->hasDownVoted($comment);

For Comment model

Get comment voters
$comment->voters()->get();
Count comment voters
$comment->voters()->count();
Get comment up voters
$comment->upVoters()->get();
Count comment up voters
$comment->upVoters()->count();
Get comment down voters
$comment->downVoters()->get();
Count comment down voters
$comment->downVoters()->count();
Check if voted by
$user = User::find(1);

$comment->isVotedBy($user);
Check if up voted by
$user = User::find(1);

$comment->isUpVotedBy($user);
Check if down voted by
$user = User::find(1);

$comment->isDownVotedBy($user);

N+1 issue

To avoid the N+1 issue, you can use eager loading to reduce this operation to just 2 queries. When querying, you may specify which relationships should be eager loaded using the with method:

// Voter
$users = User::with('votes')->get();

foreach($users as $user) {
    $user->hasVoted($comment);
}

// Votable
$comments = Comment::with('voters')->get();

foreach($comments as $comment) {
    $comment->isVotedBy($user);
}

Events

Event Description
Jcc\LaravelVote\Events\Voted Triggered when the relationship is created or updated.
Jcc\LaravelVote\Events\CancelVoted Triggered when the relationship is deleted.

Reference

License

MIT

Related Packages

doctrine/dbal

Powerful PHP database abstraction layer (DBAL) with many features for database s...

641,106,524 9,700
laravel/framework

The Laravel Framework.

593,882,149 34,959
laravel/tinker

Powerful REPL for the Laravel framework.

502,645,077 7,441
laravel/serializable-closure

Laravel Serializable Closure provides an easy and secure way to serialize closur...

418,291,778 609
nunomaduro/collision

Cli error handling for console/command-line PHP applications.

394,964,158 4,660

Version History

Version Released PHP Laravel License
v2.0.0 >=7.2 ^5.5|~6.0|~7.0|~8.0 MIT
v1.1.4 >=5.5.9 MIT
v1.1.3 >=5.5.9 MIT
v1.1.2 >=5.5.9 MIT
v1.1.1 >=5.5.9 MIT