开源软件名称(OpenSource Name): overtrue/laravel-favorite开源软件地址(OpenSource Url): https://github.com/overtrue/laravel-favorite开源编程语言(OpenSource Language):
PHP
100.0%
开源软件介绍(OpenSource Introduction): Laravel Favorite
❤️ User favorite feature for Laravel Application.
Installing
composer require overtrue/laravel-favorite -vvv
Configuration & Migrations
php artisan vendor:publish
Usage
Traits
Overtrue\LaravelFavorite\Traits\Favoriter
use Illuminate \Notifications \Notifiable ;
use Illuminate \Contracts \Auth \MustVerifyEmail ;
use Illuminate \Foundation \Auth \User as Authenticatable ;
use Overtrue \LaravelFavorite \Traits \Favoriter ;
class User extends Authenticatable
{
use Favoriter ;
<...>
}
Overtrue\LaravelFavorite\Traits\Favoriteable
use Illuminate \Database \Eloquent \Model ;
use Overtrue \LaravelFavorite \Traits \Favoriteable ;
class Post extends Model
{
use Favoriteable ;
<...>
}
API
$ user = User ::find (1 );
$ post = Post ::find (2 );
$ user ->favorite ($ post );
$ user ->unfavorite ($ post );
$ user ->toggleFavorite ($ post );
$ user ->getFavoriteItems (Post ::class)
$ user ->hasFavorited ($ post );
$ post ->hasBeenFavoritedBy ($ user );
Get object favoriters:
foreach ($ post ->favoriters as $ user ) {
// echo $user->name;
}
Get Favorite Model from User.
Used Favoriter Trait Model can easy to get Favoriteable Models to do what you want.
_note: this method will return a Illuminate\Database\Eloquent\Builder
_
$ user ->getFavoriteItems (Post ::class);
// Do more
$ favortePosts = $ user ->getFavoriteItems (Post ::class)->get ();
$ favortePosts = $ user ->getFavoriteItems (Post ::class)->paginate ();
$ favortePosts = $ user ->getFavoriteItems (Post ::class)->where ('title' , 'Laravel-Favorite' )->get ();
Aggregations
// all
$ user ->favorites ()->count ();
// with type
$ user ->favorites ()->withType (Post ::class)->count ();
// favoriters count
$ post ->favoriters ()->count ();
List with *_count
attribute:
$ users = User ::withCount ('favorites' )->get ();
foreach ($ users as $ user ) {
echo $ user ->favorites_count ;
}
// for Favoriteable models:
$ posts = Post ::withCount ('favoriters' )->get ();
foreach ($ posts as $ post ) {
echo $ post ->favorites_count ;
}
Attach user favorite status to favoriteable collection
You can use Favoriter::attachFavoriteStatus($favoriteables)
to attach the user favorite status, it will set has_favorited
attribute to each model of $favoriteables
:
For model
$ post = Post ::find (1 );
$ post = $ user ->attachFavoriteStatus ($ post );
// result
[
"id " => 1
"title " => "Add socialite login support. "
"created_at" => "2021-05-20T03:26:16.000000Z "
"updated_at" => "2021 -05 -20 T03 :26 :16.000000 Z "
"has_favorited" => true
],
For Collection | Paginator | LengthAwarePaginator | array
:
$ posts = Post ::oldest ('id' )->get ();
$ posts = $ user ->attachFavoriteStatus ($ posts );
$ posts = $ posts ->toArray ();
// result
[
[
"id " => 1
"title " => "Post title1 "
"created_at" => "2021 -05 -20 T03 :26 :16.000000 Z "
"updated_at" => "2021 -05 -20 T03 :26 :16.000000 Z "
"has_favorited" => true
],
[
"id " => 2
"title " => "Post title2 "
"created_at" => "2021-05-20T03:26:16.000000Z "
"updated_at" => "2021 -05 -20 T03 :26 :16.000000 Z "
"has_favorited" => false
],
[
"id " => 3
"title " => "Post title3 "
"created_at" => "2021-05-20T03:26:16.000000Z "
"updated_at" => "2021 -05 -20 T03 :26 :16.000000 Z "
"has_favorited" => true
],
]
For pagination
$ posts = Post ::paginate (20 );
$ user ->attachFavoriteStatus ($ posts );
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:
// Favoriter
$ users = User ::with ('favorites' )->get ();
foreach ($ users as $ user ) {
$ user ->hasFavorited ($ post );
}
// Favoriteable
$ posts = Post ::with ('favorites' )->get ();
// or
$ posts = Post ::with ('favoriters' )->get ();
foreach ($ posts as $ post ) {
$ post ->isFavoritedBy ($ user );
}
Events
Event
Description
Overtrue\LaravelFavorite\Events\Favorited
Triggered when the relationship is created.
Overtrue\LaravelFavorite\Events\Unfavorited
Triggered when the relationship is deleted.
Related packages
Contributing
You can contribute in one of three ways:
File bug reports using the issue tracker .
Answer questions or fix bugs on the issue tracker .
Contribute new features or update the wiki.
The code contribution process is not very formal. You just need to make sure that you follow the PSR-0, PSR-1, and PSR-2 coding guidelines. Any new code contributions must be accompanied by unit tests where applicable.
❤️ Sponsor me
如果你喜欢我的项目并想支持它,点击这里 ❤️
Project supported by JetBrains
Many thanks to Jetbrains for kindly providing a license for me to work on this and other open-source projects.
PHP 扩展包开发
想知道如何从零开始构建 PHP 扩展包?
请关注我的实战课程,我会在此课程中分享一些扩展开发经验 —— 《PHP 扩展包实战教程 - 从入门到发布》
License
MIT
请发表评论