【laravel】點贊功能
阿新 • • 發佈:2019-01-02
正如尼采所說:其實人跟樹是一樣的,越是嚮往高處的陽光,它的根就越要伸向黑暗的地底。 我們要擁有知識,必須時刻努力,世界上最難的兩個字莫過於“堅持”,如果你克服了自己,就會登上人生的巔峰!
下面開始我們今天的學習:
我們以文章點贊為例,建立點讚的路由
//點讚的路由 {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::fistOrCreate($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'));
}