servnx/getcandy-favorites

GetCandy 2 收藏插件

v1.0-beta.4 2022-04-15 01:21 UTC

README

GetCandy 2 应用程序的收藏插件。

安装

composer require servnx/getcandy-favorites

发布配置和迁移(可选)

php artisan vendor:publish --tag="getcandy-favorites"

运行迁移

php artisan migrate

向 GetCandy 管理中心添加屏幕(可选)

如果您已安装管理中心,可以通过发布上述配置并将 hub 值设置为 true(默认为 false)来启用屏幕。

/*
* If you have GetCandy Admin Hub installed set this to true (default is false).
*/
'hub' => true,

收藏者

收藏者 是那些正在收藏对象的 用户

收藏者特征 添加到您希望的用户模型。

use Servnx\GetCandyFavorite\Traits\Favoriter;

class User extends Authenticatable
{
    use HasFactory,
        GetCandyUser,
        Favoriter,
        Billable,
        Notifiable;
       
    ...
}

用法

支持的 GetCandy 收藏模型。

GetCandy\Models\Product::class
... more to come ...

将可收藏添加到您自己的模型。

use Illuminate\Database\Eloquent\Model;
use Servnx\GetCandyFavorite\Traits\Favoriteable;

class Post extends Model
{
    use Favoriteable;
    
    ...
}

API

$user = User::find(1);
$product = Product::find(2);

$user->favorite($product);
$user->unfavorite($product);
$user->toggleFavorite($product);
$user->getFavoriteItems(Product::class)

$user->hasFavorited($product);
$product->hasBeenFavoritedBy($user);

获取收藏者示例

foreach($product->favoriters as $user) {
    ...
}

从用户获取收藏模型。

这将返回一个 Illuminate\Database\Eloquent\Builder 实例。

$favoriteItems = $user->getFavoriteItems(Product::class);

// more examples
$favoriteItems->get();
$favoriteItems->paginate();
$favoriteItems->find(1)->get();

聚合

// all favorites by this user
$user->favorites->count();

// how many Products has this user favorited ?
$user->favorites()->withType(Product::class)->count();

// how many users favorited this product ?
$product->favoriters->count();

使用 *_count 属性列出

$users = User::withCount('favorites')->get();

foreach($users as $user) {
    echo $user->favorites_count;
}


// for Favoriteable models:
$products = Product::withCount('favoriters')->get();

foreach($products as $product) {
    echo $product->favoriters_count;
}

将用户收藏状态附加到可收藏集合

您可以使用 Favoriter::attachFavoriteStatus($favoriteables) 附加用户收藏状态,它将为 $favoriteables 中的每个模型设置 has_favorited 属性

对于 模型

$product = Product::find(1);

$product = $user->attachFavoriteStatus($product);

$product->toArray();

// example result
[
    "id" => 1
    ...
    "has_favorited" => true
],

对于 Collection | Paginator | LengthAwarePaginator | 数组

$products = Product::oldest('id')->get();

$products = $user->attachFavoriteStatus($products);

$products->toArray();

// example result
[
  [
    "id" => 1
    ...
    "has_favorited" => true
  ],
  [
    "id" => 2
    ...
    "has_favorited" => false
  ],
  [
    "id" => 3
    ...
    "has_favorited" => true
  ],
]

N+1 问题

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

// Favoriter
$users = User::with('favorites')->get();

// Favoriteable
$products = Product::with('favorites')->get();
$products = Product::with('favoriters')->get();

事件

许可

MIT

感谢 Overtrue Laravel Favorites