用 Laravel Collect 收藏文章

Laravel Collect 是我开发的一个收藏文章的扩展,借鉴于 cybercog/laravel-love ,我也有幸参加了社区对该扩展的外文翻译文章 为你的 Eloquent 模型添加喜欢和讨厌功能。我的初衷是学习怎么开发 Laravel 扩展包,所以实现的功能可能比较简单,请大神勿喷。但是对于想学习开发 Laravel 扩展包的同学还是不错的。望大家点赞支持,感谢。

最近发现已经有人使用我的扩展包到项目里,我更有动力不断更新完善。fight!

安装

通过 composer 安装,命令如下:

$ composer require vetor/laravel-collect

我们需要执行模型迁移命令,将 Collections 表发布到我们的数据库:

$ php artisan migrate

使用

在我们的收藏者表,即 User 表里需要实现 CollectorContract 接口,并引用 Collector trait:

use Illuminate\Foundation\Auth\User as Authenticatable;
use Vetor\Laravel\Collect\Collector\Models\Traits\Collector;
use Vetor\Contracts\Collect\Collector\Models\Collector as CollectorContract;

class User extends Authenticatable implements CollectorContract
{
    use Collector;
}

如果用户需要收藏文章,在 Article 表里实现 CollectableContract 接口并引用 Collectable trait 即可:

use Vetor\Laravel\Collect\Collectable\Models\Traits\Collectable;
use Vetor\Contracts\Collect\Collectable\Models\Collectable as CollectableContract;

class Article extends Model implements CollectableContract
{
    use Collectable;
}

可用的方法

对于用户来说,可用的方法有:

// 收藏
$user->collect($article);

// 取消收藏
$user->cancelCollect($article);

// 用户的所有收藏记录
$user->collections;

// 用户收藏的文章记录
$user->collectionsWhereCollectable(Article::class);

文章可用的方法有:

// 收藏
$article->collect();

// 取消收藏(默认为当前用户,可以把用户实例作为参数传入)
$article->cancelCollect();

//  获取文章的收藏情况
$article->collections();

// 获取文章收藏数
$article->collections_count;

// 根据收藏数排序(升序 'asc';降序 'desc';默认为升序)
Article::orderByCollectionsCount()->get();

我们可以通过下面的方法来获取收藏表里所有文章:

Collection::whereCollectable(Article::class)->get();

更多

代码参见 Github 仓库 vetor/laravel-collect,欢迎大家提出自己的想法,指出不足,我们一起学习进步。再次感谢 cybercog/laravel-love

本作品采用《CC 协议》,转载必须注明作者和本文链接
Persevere,Vtr!
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10

我最近也正准备开发一个laravel扩展包,很适合我。

5年前 评论

感谢博主的回复,问题已解决,首先需要去 User model 设置对应的关联关系
User model 我这里关联的是 Trading Job 两个模型

    public function collectionTradings()
    {
        return $this->morphedByMany(Trading::class, 'collectable', 'collections',
            'user_id', 'collectable_id')
            ->wherePivot('deleted_at', null)->withTimestamps();
    }

    public function collectionJobs()
    {
        return $this->morphedByMany(Job::class, 'collectable', 'collections',
            'user_id', 'collectable_id')
            ->wherePivot('deleted_at', null)->withTimestamps();
    }

然后在控制器就能倒序查询我收藏的不同类型了

public function collectionList()
    {
        $user = \Auth::user();
        $user = User::with(['collections.collectable', 'collections' => function ($query) {
            return $query->orderBy('id', 'desc')->paginate(20);
        }])->find($user->id);
        return $this->response->collection($user->collections, new HBCollectionTransformer());
    }
4年前 评论

@JeromeRao 哈哈,很棒!!!

4年前 评论

博主好,如果收藏后再取消收藏,然后又来收藏的时候,调用 $article->collect(); 会报错,因为模型加了唯一索引 collect_user_unique 怎么解决这个问题呢?

4年前 评论
若相惜 (楼主) 4年前
JeromeRao (作者) 4年前
若相惜 (楼主) 4年前
JeromeRao (作者) 4年前
若相惜 (楼主) 4年前

博主,这篇文章是否收藏过,调用哪个方法呢?

4年前 评论
若相惜 (楼主) 4年前
JeromeRao (作者) 4年前
若相惜 (楼主) 4年前

@JeromeRao 我明天看下,如果没有我就加上,有你的使用我更新起来更加有动力, :blush:

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!