正如尼采所说:其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。 我们要拥有知识,必须时刻努力,世界上最难的两个字莫过于“坚持”,如果你克服了自己,就会登上人生的巅峰!
下面开始我们今天的学习:
我们以文章点赞为例,创建点赞的路由
//点赞的路由 {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'));
}