【laravel】点赞功能

正如尼采所说:其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。 我们要拥有知识,必须时刻努力,世界上最难的两个字莫过于“坚持”,如果你克服了自己,就会登上人生的巅峰!

这里写图片描述

下面开始我们今天的学习:

我们以文章点赞为例,创建点赞的路由

//点赞的路由 {post}代表文章id 并用正则限制一下只能为数字
Route::get('/posts/{post}/zan', 'App\Http\Controllers\PostController.php')->where('post', ['0-9+']);

//取消点赞的路由
Route::get('/posts/{post},unzan', 'App\Http\Controllers\PostController.php')->where('post', ['0-9+']);

利用migration创建 zans 数据表

php artisan make:migration create_zans_table
我们在 database 文件夹中的 migrations 文件夹下会看见生成的文件 ,打开文件,创建表数据

这里写图片描述

创建如下:

这里写图片描述

使用migrate创建 zans
php artisan migrate

然后我们创建赞模型

php artisan make:model Zans

Posts 模型中 绑定 Posts 模型和 Zans 模型之间的关系

//关联用户赞  相当于 `select * from `zans` where user_id = {$user_id}`
public function zan($user_id)
{
	return $this->hasOne('App\Zans', 'post_id', 'id')->where('user_id' , $user_id);
}

//文章的所有赞
public function zans()
{
	return $this->hasMany('App\Zans', 'post_id', 'id');
}

模型关系绑定完毕,接下来在PostController中创建两个方法 zan() zans()

//用户点赞 (实际上就是向zans表中插入数据)
public function zan(Posts $post)
{
	$params = [
		//获取用户id
		'user_id' => 'Auth::id()', 
		//获取文章id
		'post_id' => $post->id
	];
	//firstOrCreate 判断 `Zans` 表中是否有这个对象,没有则创建
	Zans::firstOrCreate($params);
	return back();
}


//用户取消点赞 (删除之前点赞的记录)
public function unzan(Posts $post)
{
	//利用Posts的模型关联关系 查找到那条记录并删除
	$post->zan(Auth::id)->delete();
	return back();
}

文章详情页添加赞和取消赞的路由

<div>
	 {{--判断当前用户是否点赞(点赞显示取消按钮,没有点赞显示点赞按钮)--}}
     @if($post->zan(\Auth::id())->exists())
         <a href="/posts/{{ $post->id }}/unzan" type="button" class="btn btn-primary btn-lg">取消赞</a>
     @else
         <a href="/posts/{{ $post->id }}/zan" type="button" class="btn btn-primary btn-lg">赞</a>
     @endif
</div>

文章列表页可能还有显示该文章点赞的次数,可以这样实现

	//文章列表页 (该方法为查询文章列表页面的方法)
	//我们可以用withCount('模型名')方法来查询文章的 '赞' 数
    public function index()
    {
        if (Auth::check() == false) {
            return redirect('/login');
        }
        $post = Posts::orderBy('created_at', 'desc')->withCount('zans')->paginate(10);
        return view('post.index', compact('post'));
    }

最后使用 模型名(zans)+'_count' 的格式来渲染

<p class="blog-post-meta">赞 {{ $v->zans_count }} </p>

如果咱首页我们既想获取点赞的数量又想获取评论的数量,我们可以这样操作

//还是以这个为例 只需要在withCount()方法中用数组来存放模型名即可 调用方法都是使用 `模型名(zans)+'_count'` 的格式来渲染,我们假设 'comment' 为评论模型名
public function index()
    {
        if (Auth::check() == false) {
            return redirect('/login');
        }
        $post = Posts::orderBy('created_at', 'desc')->withCount(['zans', 'comment'])->paginate(10);
        return view('post.index', compact('post'));
    }
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值