用 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!
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 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年前 评论

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