Coder Social home page Coder Social logo

christiankuri / laravel-favorite Goto Github PK

View Code? Open in Web Editor NEW
227.0 6.0 47.0 46 KB

Allows Laravel Eloquent models to implement a 'favorite', 'like', 'remember' and 'follow' features.

License: MIT License

PHP 100.00%
laravel-5-package favorite follow eloquent-models trait like

laravel-favorite's Introduction

Laravel Favorite (Laravel 5, 6, 7, 8 Package)

Latest Version on Packagist Packagist Downloads Software License Build Status

Allows Laravel Eloquent models to implement a 'favorite' or 'remember' or 'follow' feature.

Index

Installation

  1. Install the package via Composer
$ composer require christiankuri/laravel-favorite
  1. In Laravel >=5.5 this package will automatically get registered. For older versions, update your config/app.php by adding an entry for the service provider.
'providers' => [
    // ...
    ChristianKuri\LaravelFavorite\FavoriteServiceProvider::class,
];
  1. Publish the database from the command line:
php artisan vendor:publish --provider="ChristianKuri\LaravelFavorite\FavoriteServiceProvider"
  1. Migrate the database from the command line:
php artisan migrate

Models

Your User model should import the Traits/Favoriteability.php trait and use it, that trait allows the user to favorite the models. (see an example below):

use ChristianKuri\LaravelFavorite\Traits\Favoriteability;

class User extends Authenticatable
{
	use Favoriteability;
}

Your models should import the Traits/Favoriteable.php trait and use it, that trait have the methods that you'll use to allow the model be favoriteable. In all the examples I will use the Post model as the model that is 'Favoriteable', thats for example propuses only. (see an example below):

use ChristianKuri\LaravelFavorite\Traits\Favoriteable;

class Post extends Model
{
    use Favoriteable;
}

That's it ... your model is now "favoriteable"! Now the User can favorite models that have the favoriteable trait.

Usage

The models can be favorited with and without an authenticated user (see examples below):

Add to favorites and remove from favorites:

If no param is passed in the favorite method, then the model will asume the auth user.

$post = Post::find(1);
$post->addFavorite(); // auth user added to favorites this post
$post->removeFavorite(); // auth user removed from favorites this post
$post->toggleFavorite(); // auth user toggles the favorite status from this post

If a param is passed in the favorite method, then the model will asume the user with that id.

$post = Post::find(1);
$post->addFavorite(5); // user with that id added to favorites this post
$post->removeFavorite(5); // user with that id removed from favorites this post
$post->toggleFavorite(5); // user with that id toggles the favorite status from this post

The user model can also add to favorites and remove from favrites:

$user = User::first();
$post = Post::first();
$user->addFavorite($post); // The user added to favorites this post
$user->removeFavorite($post); // The user removed from favorites this post
$user->toggleFavorite($post); // The user toggles the favorite status from this post

Return the favorite objects for the user:

A user can return the objects he marked as favorite. You just need to pass the class in the favorite() method in the User model.

$user = Auth::user();
$user->favorite(Post::class); // returns a collection with the Posts the User marked as favorite

Return the favorites count from an object:

You can return the favorites count from an object, you just need to return the favoritesCount attribute from the model

$post = Post::find(1);
$post->favoritesCount; // returns the number of users that have marked as favorite this object.

Return the users who marked this object as favorite

You can return the users who marked this object, you just need to call the favoritedBy() method in the object

$post = Post::find(1);
$post->favoritedBy(); // returns a collection with the Users that marked the post as favorite.

Check if the user already favorited an object

You can check if the Auth user have already favorited an object, you just need to call the isFavorited() method in the object

$post = Post::find(1);
$post->isFavorited(); // returns a boolean with true or false.

Testing

The package have integrated testing, so everytime you make a pull request your code will be tested.

Change log

Please see CHANGELOG for more information on what has changed recently.

Contributions

Contributions are welcome and will be fully credited. We accept contributions via Pull Requests on Github.

Pull Requests

  • PSR-2 Coding Standard - Check the code style with $ composer check-style and fix it with $ composer fix-style.

  • Add tests! - Your patch won't be accepted if it doesn't have tests.

  • Document any change in behaviour - Make sure the README.md and any other relevant documentation are kept up-to-date.

  • Consider our release cycle - We try to follow SemVer v2.0.0. Randomly breaking public APIs is not an option.

  • Create feature branches - Don't ask us to pull from your master branch.

  • One pull request per feature - If you want to do more than one thing, send multiple pull requests.

  • Send coherent history - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please squash them before submitting.

Security

Please report any issue you find in the issues page. Pull requests are welcome.

Credits

License

The MIT License (MIT). Please see License File for more information.

laravel-favorite's People

Contributors

christiankuri avatar jedsonmelo avatar king724 avatar renatofmachado avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

laravel-favorite's Issues

General Question - Toggle Favorite icon with count in view

I have installed your package and added $user = User::first(); $user->toggleFavorite($article); in the articleshow method.

How to create a icon in the view blade file so that when a user clicks on it the logged in user is added to favorites count of the post and when the user clicks it again, he is removed from the favorites count of that article.

I see that there are $user->addFavorite($article); and $user->removeFavorite($article); But how to use them in the controller to gain the functionality i mentioned

Custom Model

Any chance of creating a custom Favorite model and extending the original?

Thanks!

user->favorite() function

Detailed description

How can the user->favorite() function get me an array of the favoriteable items? thank you!

I'm getting a collection with the favoriteable id as an index and didn't know how to change it :"(

Trying to get property of non-object (View: D:\xampp\htdocs\2018\project\resources\views\backend\articles\index.blade.php)

This is how my controller code looks like

public function index()
  {
    $userid = Auth::user()->id;
    $user = Auth::user();
    $favoritevideos = $user->favorite(Video::class);
    $videos = Video::where('created_by', $userid)->latest()->paginate(12);
    return view('backend.videos.index', compact('videos', 'favoritevideos'));
  }

And in my view when i do this

@forelse ($favoritearticles as $article)
                      <div class="col-md-4">
                        <div class="item r-t">
                          <div class="item-media item-media-16by9">
                            <a href="{{ url('articles/'.$article->category->slug.'/'.$article->slug) }}" class="item-media-content" style="background-image: url({{ asset('uploads/articles/'.$article->image) }})"></a>
                          </div>
                          <div class="item-overlay active top p-3">
                            <a href="{{ url('articles/'.$article->category->slug) }}" class="text-u-c badge">{{ $article->category->name }}</a>
                          </div>
                        </div>
                        <div class="p-2 border">
                          <div class="mb-2 h-2x">
                            <a href="{{ url('articles/'.$article->category->slug.'/'.$article->slug) }}" class="_800">{{ $article->title }}</a>
                          </div>
                          <span class="mr-2"><i class="fa fa-eye"></i> {{ $article->getPageViews() }} views</span> <a href="#" class="mr-2"><i class="fa fa-heart-o"></i> {{ $article->favoritesCount }}</a> likes
                        </div>
                      </div>
                    @empty
                      <div class="padding">
                          <span>You have not liked any articles.</span>
                      </div>
                    @endforelse

I see the error
Trying to get property of non-object (View: D:\xampp\htdocs\2018\project\resources\views\backend\articles\index.blade.php)

All the tables are currently empty. When i add an article and favorite it via tinker the error is gone. When i move the project to the live production server initially the project would be empty and it would show error to my client. How to solve this?

Your environment

Environment : Localhost XAMPP
Laravel 5.6
Php 7.1
Windows 7

Column id

Why is column ID missing in migration?

Is there any feature we can use user model as Favoriteability and Favoriteable? Actually I want one user can favorite to another user

Detailed description

Provide a detailed description of the change or addition you are proposing.

Make it clear if the issue is a bug, an enhancement or just a question.

Context

Why is this change important to you? How would you use it?

How can it benefit other users?

Possible implementation

Not obligatory, but suggest an idea for implementing addition or change.

Your environment

Include as many relevant details about the environment you experienced the bug in and how to reproduce it.

  • Version used (e.g. PHP 5.6, HHVM 3):
  • Operating system and version (e.g. Ubuntu 16.04, Windows 7):
  • Link to your project:
  • ...
  • ...

Missing id column in default favorites table migration

Missing column id in default favorites table migration

when i try to add some model to favorites it generates following query, which requires id column

SQL: insert into "favorites" ("user_id", "favoriteable_id", "favoriteable_type", "updated_at", "created_at") values (1, 2, App\Models\Institution\Institution, 2021-04-19 06:19:59, 2021-04-19 06:19:59) returning "id"

i dont really realize why and where this is happening, i guess it has something to do with relationtship registration

Possible implementation

add id column to default migration, or figure out why eloquent adds requiring "id" to its query and get rid of it

My environment

  • php 7.4
  • laravel 8.36.2

problem

how can people who are not signed in add favorit list

Trying to get property of non-object on $users = $object->favoritedBy()

Detailed description

It worked on last version, but since I upgraded Laravel to 5.8 I have this error when I try to get a collection of users that have "favorited" an item.

Context

My Favoriteable model is links (user can favourite any link of the application).
My (very simple) Links model:

class Links extends Model
{
	use Favoriteable;
}

My Users model:

class User extends Authenticatable
{
    use Favoriteability;
    [...]
}

In a test controller, I want to

$link = Links::findOrFail(22);
$users = $link->favoritedBy();

Yes link 22 does exist in database :) The error is on $link->favoritedBy(); then on

    public function favoritedBy()
    {
        return $this->favorites()->with('user')->get()->mapWithKeys(function ($item) {
            return [$item['user']->id => $item['user']];
        });
    }

The following are working correctly:

$link = Links::findOrFail($id);
$favoriteCount = $link->favoritesCount;

Will generate select count(*) as aggregate from [favorites] where [favorites].[favoriteable_id] = 22 and [favorites].[favoriteable_id] is not null and [favorites].[favoriteable_type] = 'App\Models\Users\Links' as expected

$link = Links::findOrFail($request->input('link_id'));
$link->toggleFavorite();

Will generate select top 1 1 [exists] from [favorites] where [favorites].[favoriteable_id] = 22 and [favorites].[favoriteable_id] is not null and [favorites].[favoriteable_type] = 'App\Models\Users\Links' and [user_id] = 84 and insert into [favorites] ([user_id], [favoriteable_id], [favoriteable_type], [updated_at], [created_at]) values (84, 22, 'App\Models\Users\Links', '2019-03-19 16:41:19.984', '2019-03-19 16:41:19.984') as expected (same for removing)

Possible implementation

Your environment

  • Laravel 5.8
  • PHP 7.1.26-1+0~20190113101856.12+jessie~1.gbp7077bb
  • Package:
name     : christiankuri/laravel-favorite
descrip. : Allows Laravel Eloquent models to implement a 'favorite' or 'remember' or 'follow' feature.
keywords : ChristianKuri, Follow, favoritable, favorite, favourite, laravel, laravel-favorite, package, remember
versions : * v1.3.0
type     : library
license  : MIT License (MIT) (OSI approved) https://spdx.org/licenses/MIT.html#licenseText
source   : [git] https://github.com/ChristianKuri/laravel-favorite.git a6e519934711c4261ed546426e288432aed26422
dist     : [zip] https://api.github.com/repos/ChristianKuri/laravel-favorite/zipball/a6e519934711c4261ed546426e288432aed26422 a6e519934711c4261ed546426e288432aed26422
names    : christiankuri/laravel-favorite
  • Linux distrib:
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"

Auth::user()->favorite(Model::class) can be only called in a controller or in routes.php

Detailed description

I was trying to get the favorite items of a user when I noticed that no results are shown if the query is performed from blade or livewire. How can we call the method favorite() globally?

Context

Use this method in Blade or with Laravel Livewire

Possible implementation

Could be used like as a Helper function(?)

Your environment

Include as many relevant details about the environment you experienced the bug in and how to reproduce it.

  • PHP8.1, Laravel 8:
  • Mac OS Monterey:

Eager load $article->isFavorited()

Detailed description

Hi there!

When i check if article is favorited by auth user

$article->isFavorited()

the debugbar gives me

Model: App\Models\Article => Relation: ChristianKuri\LaravelFavorite\Models\Favorite - You should add with(ChristianKuri\LaravelFavorite\Models\Favorite) to eager-load this relation.

wire controller

/**
   * The read function.
   * @return array
   */
  public function read(): array
  {
    return [
      'articles' => Article::search($this->search)
        ->with('user')
        ->where('status', true)
        ->latest()
        ->paginate($this->perPage),
    ];
  }

  public function render()
  {
    return view('livewire.front.article-wire', $this->read())->layout('layouts.app');
  }

In Article model i tried

protected $with = ['favorites'];

but it didn't work

How could I eager load that?

Thanks!

  • Laravel 9
  • Livewire

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.