abdulmananse/laravel-like-dislike

👍 为 Laravel 应用程序提供用户点赞和踩功能。

dev-main 2023-12-09 11:58 UTC

This package is auto-updated.

Last update: 2024-09-09 13:58:45 UTC


README

👍 为 Laravel 应用程序提供用户点赞和踩功能。

安装

composer require abdulmananse/laravel-like-dislike

配置

此步骤是可选的

php artisan vendor:publish --provider="Abdulmananse\\LaravelLikeDislike\\LikeServiceProvider" --tag=config

迁移

此步骤也是可选的,如果您想自定义点赞表,可以发布迁移文件

php artisan vendor:publish --provider="Abdulmananse\\LaravelLikeDislike\\LikeServiceProvider" --tag=migrations

用法

特性

Abdulmananse\LaravelLikeDislike\Traits\Liker

use Illuminate\Foundation\Auth\User as Authenticatable;
use Abdulmananse\LaravelLikeDislike\Traits\Liker;

class User extends Authenticatable
{
    use Liker;

    <...>
}

Abdulmananse\LaravelLikeDislike\Traits\Likeable

use Illuminate\Database\Eloquent\Model;
use Abdulmananse\LaravelLikeDislike\Traits\Likeable;

class Post extends Model
{
    use Likeable;

    <...>
}

API

$user = User::find(1);
$post = Post::find(2);

$user->like($post);
$user->dislike($post);
$user->unlike($post);

$user->toggleLike($post);
$user->toggleDislike($post);

$user->hasLiked($post);
$user->hasDisliked($post);
$post->isLikedBy($user);
$post->isDislikedBy($user);

分页获取用户点赞

$likes = $user->likes()->with('likeable')->paginate(20);

foreach ($likes as $like) {
    $like->likeable; // App\Post instance
}

分页获取用户踩

$dislikes = $user->dislikes()->with('likeable')->paginate(20);

foreach ($dislikes as $dislike) {
    $dislike->likeable; // App\Post instance
}

获取对象点赞者

foreach($post->likers as $user) {
    // echo $user->name;
}

分页

$likers = $post->likers()->paginate(20);

foreach($likers as $user) {
    // echo $user->name;
}

获取对象踩者

foreach($post->dislikers as $user) {
    // echo $user->name;
}

分页

$dislikers = $post->dislikers()->paginate(20);

foreach($dislikers as $user) {
    // echo $user->name;
}

聚合

// all likes
$user->likes()->count();

// short way
$user->totalLikes;

// with type
$user->likes()->withType(Post::class)->count();

// all dislikes
$user->dislikes()->count();

// short way
$user->totalDislikes;

// with type
$user->dislikes()->withType(Post::class)->count();

// likers count
$post->likers()->count();

// short way
$post->totalLikers

// dislikers count
$post->dislikers()->count();

// short way
$post->totalDislikers

使用 *_count 属性列出

// likes_count
$users = User::withCount('likes')->get();

foreach($users as $user) {
    // $user->likes_count;
}

// dislikes_count
$users = User::withCount('dislikes')->get();

foreach($users as $user) {
    // $user->dislikes_count;
}

// likers_count
$posts = Post::withCount('likers')->get();

foreach($posts as $post) {
    // $post->likers_count;
}

// dislikers_count
$posts = Post::withCount('dislikers')->get();

foreach($posts as $post) {
    // $post->dislikers_count;
}

N+1 问题

为了避免 N+1 问题,您可以使用预加载来将此操作减少到仅2个查询。在查询时,您可以使用 with 方法指定哪些关系应该被预加载

// Liker
$users = User::with('likes')->get();

foreach($users as $user) {
    $user->hasLiked($post);
}

// Disliker
$users = User::with('dislikes')->get();

foreach($users as $user) {
    $user->hasDisliked($post);
}

// Likeable
$posts = App\Post::with('likes')->get();
// or
$posts = App\Post::with('likers')->get();

foreach($posts as $post) {
    $post->isLikedBy($user);
}

// Dislike
$posts = Post::with('dislikes')->get();
// or
$posts = Post::with('dislikers')->get();

foreach($posts as $post) {
    $post->isDislikedBy($user);
}

当然,我们有一个更好的解决方案,以下部分将详细介绍:

将用户点赞/踩状态附加到可点赞集合

您可以使用 Liker::attachLikeDislikeStatus($likeables) 来附加用户点赞状态,它将为 $likeables 中的每个模型附加 has_likedhas_disliked 属性

对于模型

$post = Post::find(1);

$post = $user->attachLikeDislikeStatus($post);

// result
[
    "id" => 1
    "title" => "Add socialite login support."
    "has_liked" => true
    "has_disliked" => false
],

对于 Collection | Paginator | LengthAwarePaginator | array

$posts = Post::oldest('id')->get();

$posts = $user->attachLikeDislikeStatus($posts);

$posts = $posts->toArray();

// result
[
  [
    "id" => 1
    "title" => "Post title1"
    "has_liked" => true
    "has_disliked" => false
  ],
  [
    "id" => 2
    "title" => "Post title2"
    "has_liked" => fasle
    "has_disliked" => true
  ],
  [
    "id" => 3
    "title" => "Post title3"
    "has_liked" => true
    "has_disliked" => false
  ],
]

对于分页

$posts = Post::paginate(20);

$user->attachLikeDislikeStatus($posts);

事件

许可证

MIT