yoeunes / voteable
This package helps you to add user based voting system to your model.
Requires
- php: >=7.1
- illuminate/database: >=6
- illuminate/support: >=6
Requires (Dev)
- laracasts/testdummy: >=2.3
- orchestra/testbench: >=4.5
- phpunit/phpunit: >=8.0
This package is auto-updated.
Last update: 2022-06-30 14:18:39 UTC
README
👍 👎 This package helps you to add user based voting system to your model.
You can install the package using composer
$ composer require yoeunes/voteable
Then add the service provider to config/app.php
. In Laravel versions 5.5 and beyond, this step can be skipped if package auto-discovery is enabled.
'providers' => [ ... Yoeunes\Voteable\VoteableServiceProvider::class ... ];
Publish the migrations file:
$ php artisan vendor:publish --provider='Yoeunes\Voteable\VoteableServiceProvider' --tag="migrations"
As optional if you want to modify the default configuration, you can publish the configuration file:
$ php artisan vendor:publish --provider='Yoeunes\Voteable\VoteableServiceProvider' --tag="config"
And create tables:
$ php artisan migrate
Finally, add feature trait into User model:
<?php namespace App; use Yoeunes\Voteable\Traits\Voteable; use Illuminate\Database\Eloquent\Model; class Lesson extends Model { use Voteable; }
Usage
All available APIs are listed below.
Yoeunes\Voteable\Traits\Voteable
Create a vote
$user = User::first(); $lesson = Lesson::first(); $rating = $lesson->getVoteBuilder() ->user($user) // you may also use $user->id ->uniqueVoteForUsers(true) // update if already rated ->amount(3);
Update a vote
$lesson = Lesson::first(); $lesson->updateVote($vote_id, $amount); // vote_id and the new amount value $lesson->updateVotesForUser($user_id, $amount); // update all votes for a single user related to the lesson
cancel a vote:
$lesson = Lesson::first(); $lesson->cancelVote($vote_id); // delete a vote with the giving id $lesson->cancelVotesForUser($user_id); // delete all votes for a single user related to the lesson $lesson->resetVotes(); // delete all rating related to the lesson
check if a model is already votes:
$lesson->isVoted(); $lesson->isUpVoted(); $lesson->isDownVoted(); $lesson->isUpVotedBy($user_id);// check if its already up voted by the given user $lesson->isDownVotedBy($user_id);// check if its already up voted by the given user
Fetch the votes count:
$lesson->upVotesCount(); $lesson->downVotesCount(); $lesson->votesCount(); // get the votes count (up votes + down votes)
get list of users who voted a model (voters):
$lesson->voters()->get(); $lesson->voters()->where('name', 'like', '%yoeunes%')->get(); $lesson->voters()->orderBy('name')->get();
get count votes between by dates
$lesson->countVotesByDate('2018-02-03 13:23:03', '2018-02-06 15:26:06'); $lesson->countVotesByDate('2018-02-03 13:23:03'); $lesson->countVotesByDate(null, '2018-02-06 15:26:06'); $lesson->countVotesByDate(Carbon::now()->parse('01-04-2017'), Carbon::now()->parse('01-06-2017')); $lesson->countVotesByDate(Carbon::now()->subDays(2));
other api methods:
Lesson::select('lessons.*')->orderByAverageUpVotes('asc')->get() Lesson::select('lessons.*')->orderByAverageDownVotes('desc')->get()
Query relations
$ratings = $user->votes $ratings = $user->votes()->where('id', '>', 10)->get()
date transformer
Because we all love having to repeat less, this package allows you to define date transformers. Let's say we are using the following code a lot: $lesson->countRatingsByDate(Carbon::now()->subDays(3)). It can get a little bit annoying and unreadable. Let's solve that!
If you've published the configuration file, you will see something like this:
'date-transformers' => [ // 'past24hours' => Carbon::now()->subDays(1), // 'past7days' => Carbon::now()->subWeeks(1), // 'past14days' => Carbon::now()->subWeeks(2), ],
They are all commented out as default. To make them available, simply uncomment them. The provided ones are serving as an example. You can remove them or add your own ones.
'date-transformers' => [ 'past3days' => Carbon::now()->subDays(3), ],
We can now retrieve the rating count like this:
$lesson->countVotesByDate('past3days');
License
MIT